Я использую Mocha с утверждениями Chai, ожидающими проверки моего приложения NodeJS. Я могу написать такой тест, и он отлично работает:
describe 'My Code', ->
it 'should handle exceptions', (done) ->
fn = ->
# Do something that causes an error
throw new Error()
expect(fn).to.throw(Error)
done()
Но что, если fn
должен сначала вызвать функцию, которая принимает обратный вызов, и может выдать ошибку в зависимости от результата? Например, если он попадает в базу данных и может вызвать исключение на основе результата? Это не работает:
describe 'My Callback-using Code', ->
it 'should handle exceptions thrown from callbacks', ->
doSomethingAsync = (callback) ->
setTimeout (->
callback(somecalculatedvalue)
), 1000
fn = ->
doSomethingAsync (value) ->
# The value meets a condition so throw an error
throw new Error()
expect(fn).to.throw(Error)
done()
Тест заканчивается, когда вызывается done, но исключение еще не выброшено, поэтому тест завершается неудачно. Как я могу пройти этот тест?
РЕДАКТИРОВАТЬ: Согласно ответу Питера, это неправильный подход. Это может быть лучше выражено в стиле, подобном этому:
describe 'My Error Handling Code', ->
it 'should handle errors', ->
fn = (callback) ->
getValueFromDatabase (value) ->
if value.isBad()
callback({ error: 'The value is bad.'})
else
callback()
fn (e) ->
expect(e).to.exist()
done()
Спасибо всем за вашу помощь! Это поможет во многих вещах, над которыми я работаю.