如何在带有express的node.js中带有jest的then块内获取返回的next函数的返回值?

时间:2020-04-18 21:21:10

标签: node.js express jestjs next

我刚开始学习单元测试,遇到了一个我不明白的问题。

这是我要测试的快速控制器的一部分:

exports.signupUser = async (req, res, next) => {
  ...

  await User.findOne({ email : req.body.email }).exec().then(user => {
    if (user && !user.doubleoptin) {
      return next([{ status : 422, value : req.body.email, reason : 'EMAIL_NOT_CONFIRMED' }])
    }
  }).catch(err => {
    return next([err])
  })

  ...
}

我想测试用户已注册但到目前为止尚未进行双重选择的情况。这是我为此编写的测试:

...

it('should throw an error if user exists but did not doubleoptin', async () => {
    const req = {
      body : {
        email : 'test@test.de'
      }
    }
    const next = errArray => errArray

    await userControllerClientApi.signupUser(req, null, next).then(err => {
      console.log(err)
      expect(err[0].status).toBe(422)
      expect(err[0].value).toBe(req.body.email)
      expect(err[0].reason).toBe('EMAIL_NOT_CONFIRMED')
    })
  })

...

该用户存在,所以我最终进入了if块(我检查了控制台日志,我实际上最终就在那里),但是我的测试未收到next函数的返回值,它总是失败:

TypeError: Cannot read property '0' of undefined

处于expect(err[0].status).toBe(422)语句,这是因为errundefined

我在另一个测试中使用了相同的逻辑,并且在那里工作,但是我认为这与从then块中返回有关,对吗?

以开玩笑的方式测试这种情况的最佳实践是什么?

编辑:

我刚刚发现,在测试运行期间返回next(...)时,代码执行并没有真正停止,因此它只执行检查后的其余代码

0 个答案:

没有答案