使用 Mocha 测试是不是抛出异步函数

Posted

技术标签:

【中文标题】使用 Mocha 测试是不是抛出异步函数【英文标题】:Test with Mocha for throw in asynchronous function使用 Mocha 测试是否抛出异步函数 【发布时间】:2015-04-04 00:54:12 【问题描述】:

我尝试使用 mocha 框架测试我的 MongoDB Mangoose 模型的验证。

describe 'User', ->
  describe 'create', ->
    it 'should reject a user with an already existing mail', (done) ->
      User.create
        mail: "minimal@gmail.com"
      , (err) ->
          if err then done() else done(false)

我预计 Mongoose 会出现验证错误,因为该邮件已被占用,但该字段被标记为唯一。

如何测试特定错误?我认为最干净的方法是使用should.throws(callback, message-regexp),但是,这不起作用,因为 Model#create 是异步的。

参考资料(对我没有帮助)

Testing for an Asynchronous throw in Mocha http://shouldjs.github.io/#should-throws

【问题讨论】:

【参考方案1】:

问题在于done() 回调。第一个参数检查错误,如果发生错误,它必须为 true-y。在您的代码中,您总是传递 false-y 值,这意味着测试成功运行。

在你的情况下,你想使用:

if err then done() else done(true)

您可以添加字符串或其他任何内容,而不是 true。

编辑

异步函数通常不会抛出错误。当您实际使用异常 (throw new Error(...)) 时会抛出错误。相反,Mongoose 只是调用将非 false 值传递给 err 参数(第一个)的回调。因此,只需检查 err.toString()err.message 是否与您的搜索字符串匹配。

例如,在您的回调中(假设您使用的是 Should.js,因为您的 cmets 让我想到;否则,将其转换为您实现的任何其他框架)

should(err).be.not.empty
err.toString().should.match(/ValidationError/)

(仅此而已!)

【讨论】:

使用此解决方案,我的测试将验证任何类型的错误。我想知道如何精确地要求由 mongoose 生成的 ValidationError。这些类似于should.throws(block, [error], [message])。但是,这不适用于异步测试。 好的,所以您不应该测试“should.throws”,因为 Mongoose 不会抛出错误。相反,只需在回调中测试 err.toString()err.message 是否与您想要的值匹配。我已经更新了答案。

以上是关于使用 Mocha 测试是不是抛出异步函数的主要内容,如果未能解决你的问题,请参考以下文章

异步 Mocha 测试(使用 Chai 断言库)应该失败,但被标记为通过

在mocha测试中调用异步函数如何避免超时错误:超过2000ms的超时

Mocha,应该 - 在测试具有承诺的异步函数时,断言错误是沉默的

使用 async/await 进行异步 mocha 测试时遇到问题

Mocha 异步测试超时的解决方法 [重复]

在整个 mocha 测试之前运行异步代码