2

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()

助けてくれてありがとう!これは、私が取り組んでいる多くのことに役立ちます。

4

1 に答える 1