我想测试一个返回promise的函数.
在这个特定的测试中,预期承诺将被拒绝,其中包含经典message字段的Error对象(在此测试中,它应该相等"my error message")和我添加的自定义字段named code,这是一个字符串(如"EACCESS"," ERIGHT"等,在这个测试中它预计会相等"EFOO")
我想使用chai-as-promised.
return expect(foo()).to.eventually.be.rejectedWith("my error message");
Run Code Online (Sandbox Code Playgroud)
这个断言正在起作用,但现在我也想测试这个code领域.
怎么做?
Kei*_*mus 45
如果您正在使用Chai-As-Promised(正如您所说的那样),那么它允许链接rejectedWith- 并且它将链断言对象设置为错误对象 - 意味着rejectedWith()现在将在Error上断言的任何内容.这可以让你做一些很酷的事情:
return expect(foo()).to.eventually
.be.rejectedWith("my error message")
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
Run Code Online (Sandbox Code Playgroud)
一些chai方法也链,所以你可以用它来做一些关于错误的非常深层嵌套的断言:
return expect(foo()).to.eventually
.be.rejectedWith("my error message")
.and.have.property('stack')
.that.includes('myfile.js:30')
Run Code Online (Sandbox Code Playgroud)
小智 31
拥有ChaiAsPromised的5.1.0版本,来自Keithamus的解决方案对我不起作用 - 被拒绝但没有给我断言的错误对象,但是"拒绝"做了:
return expect(foo())
.to.be.rejected
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
Run Code Online (Sandbox Code Playgroud)
用于声明多个属性
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');
});
Run Code Online (Sandbox Code Playgroud)
小智 10
@Markko Paas 的解决方案在我添加“最终”之前对我不起作用,否则拒绝的值总是 {} 空对象。
return expect(foo())
.to.eventually.be.rejected
.and.be.an.instanceOf(Error)
.and.have.property('code', 'EFOO');
Run Code Online (Sandbox Code Playgroud)
chai-as-promised就我而言,由于我在函数中使用async,所以我所要做的就是await在 之前添加一条语句expect(promise).to.be.rejectedWith(errorMessage),例如:
it('should reject', async () => {
await expect(promise).to.be.rejectedWith(errorMessage);
// ^^^^^
});
Run Code Online (Sandbox Code Playgroud)
您可以使用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
});
});
});
Run Code Online (Sandbox Code Playgroud)