Chai.throw
используется для проверки простых ошибок на их message
проп. В простых случаях ошибки это работает нормально.
it.only('Should catch a thrown message', () => {
function throwSomething() {
throw new Error('something')
}
expect(throwSomething).to.throw('something')
})
Однако, при асинхронном тестировании на сбой проверки Mon goose я вижу, что не могу получить доступ к вложенному сообщению об ошибке. Изначально я хотел использовать asyn c тесты с try + catch, но вызов expect
внутри блока catch не гарантированно выполняется, и в этом случае тест может пройти, если на самом деле не произошла ошибка.
it.only('Errors on save if username is not unique', async () => {
// setup original user
const original = new UserModel(testParams)
await original.save()
try {
// try to create a new user with the same username
const duplicate = new UserModel({
username: testParams.username,
email: 'test_other@mail.com',
password: testParams.password
})
// save the user that has a non-unique username
await duplicate.save()
} catch (err) {
// confirm the nested error was as expected
expect(err.errors.username.message).to.equal(
'Error, expected `username` to be unique. Value: ' +
'`' + testParams.username + '`'
)
}
})
Если бы я позвонил expect(duplicate.save).to.throw('...')
, это не проверяло бы нужное мне поле ошибки.
Другой вариант заключается в том, что вместо асинхронного тестирования моих моделей я использую обратные вызовы Promise и вызываю done()
внутри обратного вызова .catch()
. Однако я нахожу этот метод нежелательным, если я тестирую много вложенных операций Promise.
Есть ли способ использовать Chai.throw
для отлова сложных вложенных ошибок, производимых Mon goose?