chai-as-promised中文文档|中文示例
Chai 对 Promise 的断言
Chai as Promised使用流利的语言扩展了Chai,用于断言有关承诺的事实。
而不是手动将您的期望连接到承诺的已完成和被拒绝的处理程序:
;
你可以编写代码来表达你真正的意思:
return shouldeventually;
或者,如果您遇到return
不可取的情况(例如样式考虑)或不可能的情况(例如,测试框架不允许返回承诺以表示异步测试完成),那么您可以使用以下解决方法(done()
由测试提供的地方)框架):
shouldeventually;
注意事项:要么return
或者notify(done)
必须与承诺的断言使用。这可能与项目或团队使用的现有断言格式略有不同。那些其他断言可能是同步的,因此不需要特殊处理。
如何使用
should
/expect
界面
Chai as Promised 提供的最强大的扩展是eventually
属性。有了它,您可以将任何现有的 Chai 断言转换为一个根据承诺执行的断言:
2 + 2should; // becomesreturn Promiseshouldeventually; tohave; // becomesreturn toeventuallyhave;
还有一些特定于 Promise 的扩展(也有通常的expect
等价物):
return promiseshouldbefulfilled;return promiseshouldeventuallydeep;return promiseshould; // same as `.eventually.deep.equal`return promiseshouldberejected;return promiseshouldbe; // other variants of Chai's `throw` assertion work too.
assert
界面
与should
/expect
接口一样,Chai as Promised 为 提供了一个eventually
扩展器chai.assert
,允许在承诺上使用任何现有的 Chai 断言:
assert; // becomesreturn asserteventually;
当然,还有特定于 Promise 的扩展:
return assert; return assert;return assert; return assert;return assert;return assert;
进度回调
Chai as Promised 对测试承诺进度回调没有任何内在支持。您想要测试的属性可能更适合像Sinon.JS这样的库,也许与Sinon-Chai结合使用:
var progressSpy = sinon; return promise;
自定义输出承诺
默认情况下,由 Chai 作为 Promised 的断言返回的承诺是常规的 Chai 断言对象,使用then
从输入承诺派生的单个方法进行扩展。要更改此行为,例如使用更有用的糖方法输出承诺,例如在大多数承诺库中找到的方法,您可以覆盖chaiAsPromised.transferPromiseness
. 下面是一个转移 Qfinally
和done
方法的例子:
chaiAsPromised { assertionthen = promisethen; // this is all you get by default assertionfinally = promisefinally; assertiondone = promisedone;};
将参数转换为断言者
Promised 允许的另一个高级自定义钩子 Chai 是,如果您想将参数转换为断言,可能是异步的。这是一个玩具示例:
chaiAsPromised { return args;} Promiseshouldeventually; // will now fail!Promiseshouldeventually; // will now pass!
转换甚至可以是异步的,直接返回数组而不是数组的承诺。一个例子可能是使用Promise.all
这样的承诺数组成为一个数组的承诺。如果你这样做,那么你可以使用断言将承诺与其他承诺进行比较:
// This will normally fail, since within() only works on numbers.Promiseshouldeventuallybe; chaiAsPromised { return Promiseallargs;}; // But now it will pass, since we transformed the array of promises for numbers into// (a promise for) an array of numbersPromiseshouldeventuallybe;
兼容性
Chai as Promised 与遵循Promises/A+ 规范的所有承诺兼容。
值得注意的是,jQuery 的 promises 不符合 jQuery 3.0 之前的规范,并且 Chai as Promised 不能与它们一起使用。特别是,作为柴许大量使用了标准的相变行为的then
,它的jQuery <3.0不支持。
Angular promises 有一个特殊的消化周期来处理它们,并且需要额外的设置代码来处理 Chai 作为 Promised。
使用非承诺友好的测试运行器
一些测试运行器(例如 Jasmine、QUnit 或 tap/tape)无法使用返回的 promise 来表示异步测试完成。如果可能的话,我建议改用那些可以做到的,例如Mocha、Buster或blue-tape。但如果这不是一个选择,Chai as Promised 仍然可以满足您的需求。只要您的测试框架采用回调指示异步测试运行何时结束,Chai as Promised 就可以通过其notify
方法适应这种情况,如下所示:
; ;
在这些示例中,如果不满足条件,则测试运行器将收到形式为 的错误"expected promise to be fulfilled but it was rejected with [Error: error message]"
,或"expected promise to be rejected but it was fulfilled."
还有另一种形式notify
在某些情况下很有用,例如在承诺完成后进行断言。例如:
;
注意如何.notify(done)
直接挂在.should
,而不是出现在承诺断言之后。这表明 Chai as Promised 应该将完成或拒绝直接传递给测试框架。因此,"expected promise to be fulfilled…"
如果promise
被拒绝,上面的代码将失败并返回 Chai as Promised 错误 ( ) ,但expected "before" to equal "after"
如果otherState
没有改变,则将失败并返回一个简单的 Chai 错误 ( ) 。
多重承诺断言
要对多个Promise.all
Promise执行断言,请使用将多个 Chai 组合为 Promised 断言:
;
这会将单个承诺断言的任何失败传递给测试框架,而不是将它们包装在"expected promise to be fulfilled…"
消息中,如果你这样做了就会发生return Promise.all([…]).should.be.fulfilled
。如果您不能使用return
,则使用.should.notify(done)
,类似于前面的示例。
安装和设置
节点
做一个npm install chai-as-promised
起床和运行。然后:
var chai = ;var chaiAsPromised = ; chai; // Then either:var expect = chaiexpect;// or:var assert = chaiassert;// or:chai;// according to your preference of assertion style
你当然可以把这段代码放在一个通用的测试夹具文件中;有关使用Mocha的示例,请参阅Chai as Promised 测试本身。
使用其他 Chai 插件时请注意: Chai as Promised 会在安装时找到所有当前注册的断言并承诺它们。因此,如果您希望他们的断言者被承诺,您应该在任何其他 Chai 插件之后安装 Chai as Promised last。
在浏览器中
要在不支持类似 Node.js 的 CommonJS 模块的环境中使用 Chai as Promised,您需要使用像browserify这样的捆绑工具。另请参阅下面有关浏览器兼容性的说明。
业力
如果您正在使用Karma,请查看随附的karma-chai-as-promised插件。
浏览器/节点兼容性
Chai as Promised 需要 Node v4+ 或对现代 JavaScript 语法具有同等支持的浏览器。如果您的浏览器不支持现代 JavaScript 语法,则需要使用Babel 之类的工具将其转译。