【问题标题】: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 是异步的。

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

【问题讨论】:

    标签: node.js asynchronous mongoose mocha.js


    【解决方案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 是否与您想要的值匹配。我已经更新了答案。
    猜你喜欢
    • 2018-10-02
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多