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

Posted

技术标签:

【中文标题】使用 Mocha 和 Chai-as-Promised 测试被拒绝的 Promise 的特定属性【英文标题】:Testing for specific properties of rejected promises, with Mocha and Chai-as-Promised 【发布时间】:2014-07-22 01:32:28 【问题描述】:

我正在尝试使用Chai-as-Promised、Mocha 和“应该”方言来测试被拒绝的 Promise 的细节。 Promise 由bluebird 实现。

这很好用:

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

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

);

该错误有一个“状态”属性。我想断言状态是 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)

);

似乎任何不引用“rejected”或rejectedWith(Error) 的断言尝试都会失败,并且只会将错误打印到控制台。

如何深入了解拒绝的原因?

【问题讨论】:

试试should.eventually.be.rejectedWith(Error).and.eventually.have.property("status").that.equals(401) 谢谢,但这并没有帮助。我将更新问题以显示结果。 .should.eventually.be.rejected.and.eventually.have.property("status").that.equals(401); 有效,但不检查错误类型。 jsfiddle.net/F9SKD 嗯。我个人只会做.catch(function(err) return err instanceof Error && error.status === 401); 与小修正“error.status”一起工作的应该是“err.status” 【参考方案1】:

如果您想检查您的承诺是否被拒绝并检查结果对象(也就是原因)

return fooPromise.should.be.rejected.and.eventually.deep.equal(
   'x': 1,
   'y': 1,
   'z': 2
)

您可以将deep.equal 更改为任何常用的其他chai matchers。

注意:这是@sertug 答案的扩展,希望对其他来这里寻找这个答案的人有用。

【讨论】:

【参考方案2】:

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

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

【讨论】:

它确实有问题 (v.5.3.0) 请参阅 Pull Request 123 和 Pull Request 131。 return Promise.reject(2).should.be.rejectedWith(1); 在不应该的时候通过... 啊...在第二个链接中添加eventually 是我所缺少的。谢谢!所以这对我有用,这就是我试图开始工作的模式:promiseOfUsers.should.be.rejected.and.eventually.have.status(401)。 (与chai-http。)

以上是关于使用 Mocha 和 Chai-as-Promised 测试被拒绝的 Promise 的特定属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mocha 和 Typescript 模拟依赖项

Mocha 测试不与 Webpack 和 mocha-loader 一起运行

您如何安装和运行 Mocha,Node.js 测试模块?安装后获取“mocha:找不到命令”

如何使用 webdriverIO js 和 mocha 处理 iframe 内容

使用 mocha 的内置承诺支持测试失败的承诺 [重复]

如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?