Я только начинаю изучать юнит-тестирование и столкнулся с проблемой, которую не понимаю.
Это часть моего express -контроллера, который я хочу протестировать:
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
.
Я использую ту же логику c в другом тесте, и она работает там, но я предполагаю, что это как-то связано с возвращением из блока then, я прав?
Что было бы лучше проверить такой случай с помощью jest?
EDIT:
Я только что узнал, что выполнение кода на самом деле не останавливается при возврате next(...)
во время testrun, поэтому он просто выполняет остальную часть кода, который следует после проверки