【问题标题】:how to test a nodejs exports that contains async function如何测试包含异步功能的nodejs导出
【发布时间】:2014-02-15 03:01:16
【问题描述】:

我不确定如何测试 nodejs 的导出功能。考虑下面的代码:

exports.create_expense = (req, res, next) ->
  User = database.db_model 'user'
  req.body.parsed_dt = Date.parse(req.body.date)
  req.body.amount = parseInt(req.body.amount)
  User.update {_id: req.api_session.id}, {$push: {expenses: req.body}}, (err, numberAffected, raw) ->
    if err?
      res.send 500
    else 
      res.send 200

User 在这里是一个猫鼬对象。我想编写一个测试(使用 mocha)来测试这个函数(在我的测试中我将调用 create_expense)但是由于 User.update 是异步的,我不能只调用 create_expense 而不通过某种形式的 Promise?我知道我可以使用 supertest,但也可以测试我不想在这里做的路线。有什么方法可以测试这里的任何 npm 是否有用?

【问题讨论】:

    标签: javascript node.js express coffeescript mocha.js


    【解决方案1】:

    User.update 上,您应该致电next。稍后在测试中您应该致电done

    编辑:

    提前为我的 CoffeeScript 道歉。

    在对User.update的回调结束时调用next

    那么您的测试应该如下所示:

    describe '#create_response', () ->
      response = false
    
      req.body.date = new Date
      req.body.amount = 123
      req.api_session.id = 'asd'
    
      res.send = (code) ->
        response = code
    
      it 'should return 500 on invalid request', (done) ->
        create_expense req, res, () ->
          assert.equal response, 500
          done
    

    【讨论】:

    • 我不确定你的意思。不需要调用 next() 的带有 HTTP 代码的函数响应。您是否建议我更改测试的应用程序代码?你有例子吗?
    • 传入假的req 和假的res。发送响应后,调用next(应该是某种回调)。在next 定义中对假res 进行断言,最后调用done(框架应在测试用例中传递)。
    • 是的,你应该先写测试,然后实现代码。
    • 非常感谢。我试图看看是否有另一种方法,而不必为了测试而调用 next。习惯于那个java有办法用间谍“编织”这种东西。再次感谢是很大的帮助! :)
    猜你喜欢
    • 2018-01-25
    • 2021-01-18
    • 1970-01-01
    • 2023-03-19
    • 2021-12-29
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多