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 回调