NodeJS アプリをテストするために Chai 期待アサーションで Mocha を使用しています。私はこのようなテストを書くことができ、それはうまく動作します:
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()
助けてくれてありがとう!これは、私が取り組んでいる多くのことに役立ちます。