使用 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,应该 - 在测试具有承诺的异步函数时,断言错误是沉默的