使用Mocha和Chai-as-Promised测试被拒绝承诺的特定属性

tod*_*ist 12 javascript testing mocha.js promise chai

我试图用Chai-as-Promised,Mocha和"should"方言来测试被拒绝的Promise的细节.承诺由蓝鸟实施.

这很好用:

it('it should be rejected when given bad credentials', function () {

   var promiseOfUsers = db.auth("bad", "credentials").getUsers();
   return promiseOfUsers.should.eventually.be.rejectedWith(Error)

});
Run Code Online (Sandbox Code Playgroud)

该错误有一个"status"属性.我想声称状态是401

这不起作用:

it('it should be rejected when given bad credentials', function () {

   var promiseOfUsers = db.auth("bad", "credentials").getUsers();
   return promiseOfUsers.should.eventually.be.rejectedWith(Error)
       .that.has.property('status')
       .that.equals(401)

});
Run Code Online (Sandbox Code Playgroud)

似乎任何在没有引用"被拒绝"或者被拒绝(错误)的情况下断言的尝试都会失败并且只是将错误输出到控制台.

我该如何深入研究拒绝的原因?

小智 10

我认为rejectedWith()处理程序有一些问题.但你可以这样做:

promiseOfUsers.should.be.rejected.and.eventually.have.property("status",401)

  • 它确实有问题 (v.5.3.0) 参见 [Pull Request 123](https://github.com/domenic/chai-as-promised/issues/123) 和 [Pull Request 131](https://github .com/domenic/chai-as-promised/issues/131)。`return Promise.reject(2).should.be.rejectedWith(1);` 在不应该的时候通过... (2认同)

Jam*_*son 7

如果你想检查你的承诺是否被拒绝并检查结果对象(又名原因):

return fooPromise.should.be.rejected.and.eventually.deep.equal({
   'x': 1,
   'y': 1,
   'z': 2
})
Run Code Online (Sandbox Code Playgroud)

您可以更改deep.equal为任何其他常用的chai 匹配器.

注意:这是@ sertug答案的延伸,希望对于那些正在寻找此问题的人来说非常有用.