我刚开始学习单元测试,遇到了一个我不明白的问题。
这是我要测试的快速控制器的一部分:
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)
语句,这是因为err
是undefined
。
我在另一个测试中使用了相同的逻辑,并且在那里工作,但是我认为这与从then块中返回有关,对吗?
以开玩笑的方式测试这种情况的最佳实践是什么?
编辑:
我刚刚发现,在测试运行期间返回next(...)
时,代码执行并没有真正停止,因此它只执行检查后的其余代码