promise-sync - 同步 Promise,让测试体验更轻松
同步 Promise,让测试体验更轻松。
引言
- 你是否曾经需要使用 setTimeout仅仅是为了确保async逻辑在测试结果之前发生?
- 你的测试是否因为等待 async结果而运行缓慢?
- 你是否曾经尝试创建一个包含两个 Promise 的竞争条件测试?
- 你是否希望控制 Promise 解决或拒绝的确切时刻?
这些问题都曾困扰过我,所以我搜索了一个库来满足我的需求。所有结果都缺少一些功能,有些是 async 的,有些没有链式调用,有些在你没有订阅它们时会抛出错误。
所以我决定编写一个新的库。
特点
- 支持回调订阅:success(),catch(),then(),finally()
- 支持链式回调订阅
- 支持状态检查:state,isPending(),isRejected(),isFulfilled()
- 支持解决和拒绝:resolve(data?),reject(reason?)
- 允许忽略 success/failure/finally 回调中的断言错误
- 使用一行代码创建一个已解决/已拒绝的 Promise
- 使用 PromiseMock.all()方法等待所有 Promise 解析
- 使用 PromiseMock.race()方法等待其中一个 Promise 解析
- 使用 Typescript 编写,因此具有类型安全性
- 解决或拒绝未处于挂起状态的 Promise 将抛出错误
- 订阅已解决的 Promise 将触发适当的回调
- 订阅已拒绝的 Promise 将触发适当的回调
- 同步!
Using the Code
安装
 npm install promise-sync --save-dev
Typescript
import { PromiseMock, PromiseState } from 'promise-sync';
var promiseMock = new PromiseMock<number>();
var onSuccessCallback = () => console.log('success');
var onFailureCallback = () => console.log('failure');
var finallyCallback = () => console.log('finally');
promiseMock.then(onSuccessCallback, onFailureCallback)
           .success(onSuccessCallback)
           .catch(onFailureCallback)
           .finally(finallyCallback);
var dataToResolve = 123;
promiseMock.resolve(dataToResolve);
var errorToReject = 'some error';
promiseMock.reject(errorToReject);
var isPending = promiseMock.isPending();
var isFulfilled = promiseMock.isFulfilled();
var isRejected = promiseMock.isRejected();
var state: PromiseState = promiseMock.state;
var rejectedPromise: PromiseMock<string> = PromiseMock.reject('some error');
var resolvedPromise: PromiseMock<string> = PromiseMock.resolve('some data');
var waitForAll: PromiseMock<any[]> = PromoseMock.all(
  [
    rejectedPromise,
    resolvedPromise,
    'random data that will be converted to resolved promise'
  ]);
var waitForFirst: PromiseMock<any> = PromoseMock.race(
  [
    rejectedPromise,
    resolvedPromise,
    'random data that will be converted to resolved promise'
  ]);
JavaScript
var promise_sync = require('promise-sync');
var PromiseMock = promise_sync.PromiseMock;
var PromiseState = promise_sync.PromiseState;
var promiseMock = new PromiseMock();
var onSuccessCallback = function() { console.log('success'); }
var onFailureCallback = function() { console.log('failure'); }
var finallyCallback = function() { console.log('finally'); }
promiseMock.then(onSuccessCallback, onFailureCallback)
           .success(onSuccessCallback)
           .catch(onFailureCallback)
           .finally(finallyCallback);
var dataToResolve = 123;
promiseMock.resolve(dataToResolve);
var errorToReject = 'some error';
promiseMock.reject(errorToReject);
var isPending = promiseMock.isPending();
var isFulfilled = promiseMock.isFulfilled();
var isRejected = promiseMock.isRejected();
var state = promiseMock.state;
var rejectedPromise = PromiseMock.reject('some error');
var resolvedPromise = PromiseMock.resolve('some data');
var waitForAll = PromoseMock.all(
  [
    rejectedPromise,
    resolvedPromise,
    'random data that will be converted to resolved promise'
  ]);
var waitForFirst = PromoseMock.race(
  [
    rejectedPromise,
    resolvedPromise,
    'random data that will be converted to resolved promise'
  ]);
请注意!
then/success/catch/finally 方法会捕获回调中抛出的异常。因此,如果你想在这些方法内部进行断言,你需要告诉 PromiseMock 忽略断言错误异常,否则即使断言失败,测试也会通过。
例如,如果你正在使用 chai
Typescript
import { AssertionError } from 'chai';
import { PromiseMock } from 'promise-sync';
PromiseMock.setAssertionExceptionTypes([AssertionError]);
使用 JavaScript 的相同示例
var chai = require('chai');
var promise_sync = require('promise-sync');
var PromiseMock = promise_sync.PromiseMock;
PromiseMock.setAssertionExceptionTypes([chai.AssertionError]);
更新
2016/02/17 (版本 0.1.7)
- 更新了 npm包,仅包含必要的文件:*.js, *.d.ts 文件
2016/03/05 (版本 0.1.91)
- 添加了 PromiseMock.setAssertionExceptionTypes方法,以允许忽略 success/failure/finally 回调中的断言错误。
- 同时修复了一个 bug,当拒绝后注册时,无法传递拒绝错误
2016/03/06 (版本 1.0.0)
- 添加了对静态构建器方法的支持:PromiseMock.resolve('data'),PromiseMock.reject('error')
- 添加了对等待多个 Promise 解析的支持:PromiseMock.all(promises)
- 添加了对等待第一个 Promise 解析的支持:PromiseMock.race(promises)
2016/03/21 (版本 1.1.0)
- 修复了一个 bug,当从 success/failure 回调中返回 Promise 时,应该传播返回 Promise 的值,而不是作为参数传递给回调的值 (Issue #5)
2016/04/11 (版本 1.1.1)
- 修复了一个 bug,当链式 then 语句返回来自回调的真实 Promise 时。(Issue #7)
2016/04/14 (版本 1.1.3)
- 为了支持旧版本的 typescript,移除了 state 属性上的 readonly
- 添加了公共 License 文件
2016/04/16 (版本 1.1.4)
- 修复了一个 bug:rejectedPromose.success().catch()在catch方法中没有调用 failure 回调



