65.9K
CodeProject 正在变化。 阅读更多。
Home

promise-sync - 同步 Promise,让测试体验更轻松

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.24/5 (5投票s)

2016年2月14日

CPOL

2分钟阅读

viewsIcon

27628

同步 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 回调
© . All rights reserved.