我想测试一个返回一个promise的函数。
在此特定测试中,预计承诺将被拒绝,其中包含经典message
字段的Error对象(在此测试中,预计等于"my error message"
)并且我添加了自定义字段名为code
,这是一个字符串(如" EACCESS"," ERIGHT"等等,在此测试中它应该等于"EFOO"
)
我想使用chai-as-promised。
return expect(foo()).to.eventually.be.rejectedWith("my error message");
这个断言正在起作用,但现在我也想测试code
字段
怎么做?
答案 0 :(得分:38)
如果你正在使用Chai-As-Promised(正如你所说的那样),那么它允许链接rejectedWith
- 它将链断言对象设置为错误对象 - 意思是rejectedWith()
之后的任何内容现在都将在错误上断言。这可以让你做一些很酷的事情:
return expect(foo()).to.eventually
.be.rejectedWith("my error message")
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
一些chai方法也链,所以你可以使用它来做一些关于错误的非常深层嵌套的断言:
return expect(foo()).to.eventually
.be.rejectedWith("my error message")
.and.have.property('stack')
.that.includes('myfile.js:30')
答案 1 :(得分:31)
拥有ChaiAsPromised的5.1.0版本,来自Keithamus的解决方案对我不起作用 - 被拒绝但没有给我断言的错误对象,但是"拒绝"做的:
return expect(foo())
.to.be.rejected
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
用于声明多个属性
return expect(foo())
.to.be.rejected
.then(function(error) {
expect(error).to.have.property('name', 'my error message');
expect(error).to.have.property('code', 'EFOO');
});
答案 2 :(得分:2)
@Markko Paas的解决方案对我来说不起作用,直到我最终添加',否则被拒绝的值总是{}空对象。
return expect(foo())
.to.eventually.be.rejected
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
答案 3 :(得分:1)
您可以使用rejected.then
对错误进行复杂的测试:
it('throws a complex error', function () {
return expect(foo()).to.eventually.be.rejected.then((error) => {
expect(error.code).to.equal('expected code');
// other tests
// alternatively,
expect (error).to.eql({
foo: 'foo',
bar: 'bar
});
});
});
答案 4 :(得分:1)
Chai-As-Promised 对我不起作用,因为如果您期望某些东西被拒绝并且它不会拒绝,它不会抛出。
然后我使用了以下内容,IMO 也很有表现力:
//...
await $radioButton.click();
const executed = await(async () => {
try {
await tools.waitUntil(() => {
return consoleMessages.length === 2;
}, 1000); // 1000 is the timeout in milliseconds. waitUntil() rejects if it does timeout.
return true;
} catch (error) {
return false;
}
})();
chai.assert.strictEqual(executed, false);
答案 5 :(得分:0)
就我而言,由于我在 em
函数中使用了 chai-as-promised
,所以我所要做的就是在 async
之前添加一个 await
语句。