【发布时间】:2018-06-01 06:05:20
【问题描述】:
我正在使用chai-as-promised 来测试一些承诺。我的问题是我不确定如何在单个测试中包含多个期望语句。为了让expect().to.be.fulfilled 正常工作,我需要将其退回,如下所示:
it('test', () => {
return expect(promise).to.be.fulfilled
}
...或者使用notify,像这样:
it('test', (done) => {
expect(promise).to.be.fulfilled.notify(done)
}
当我有另一件事需要检查时,问题就出现了,例如某个函数被调用,如下所示:
it('test', (done) => {
var promise = doSomething()
expect(sinon_function_spy.callCount).to.equal(1)
expect(promise).to.be.fulfilled.notify(done)
})
这里的问题是,因为doSomething() 是异步的,所以当我调用expect 时,可能还没有调用sinon_function_spy,这使得这个测试变得不稳定。如果我使用then,像这样:
it('test', (done) => {
var promise = doSomething()
promise.then(() => {
expect(sinon_function_spy.callCount).to.equal(1)
})
expect(promise).to.be.fulfilled.notify(done)
})
然后测试技术上按预期通过和失败,但由于then调用中抛出的异常,promise被拒绝,它会失败。同样,如果我有一个承诺会被拒绝的情况:
it('test', (done) => {
var promise = doSomething()
promise.then(() => {
expect(sinon_function_spy.callCount).to.equal(1)
})
expect(promise).to.be.rejected.notify(done)
})
然后对sinon_function_spy 的检查永远不会被调用,因为承诺被拒绝并且不会调用then。
如何让expect 语句可靠地执行并返回正确的值?
【问题讨论】:
-
Mocha 使用异常或承诺拒绝来报告失败。即使使用同步断言,如果第一个断言失败,其余断言也不会运行。我不认为 mocha 真的支持在失败后执行断言。您是否有理由同时执行这两个断言?
-
是的。我需要检查这两种情况是否都发生了测试用例才能成功。如果 promise 按预期解决,但函数没有被调用,则测试用例不应该通过。
标签: javascript node.js mocha.js chai chai-as-promised