2

Mochaを使用していくつかのNode.jsコードをテストしておりprocess.nextTick()、メソッドのコールバックを呼び出すために使用したいと考えています。

コード

  @getNouns: (callback) ->
    @_wordnik.randomWords(
      includePartOfSpeech: 'noun',
      (e, result) ->
        throw new Error('Wordnik Failed') if e
        process.nextTick ->
          callback(result)
    )

テスト

it 'should call a callback with the response', (done) ->
      sinon.stub(Word._wordnik, 'randomWords').yields(null, [
                              {id: 1234, word: "hello"},
                              {id: 2345, word: "foo"},
                              {id: 3456, word: "goodbye"}
                            ]
                          )
 
      spy = sinon.spy()

      Word.getNouns (result) -> spy(result); done(); null

      expect(spy).have.been.calledWith [
        {id: 1234, word: "hello"},
        {id: 2345, word: "foo"},
        {id: 3456, word: "goodbye"}
      ]

何らかの理由で、done()mocha を実行すると、2 回呼び出されたというエラーが発生します。の外でコールバックを実行すると、process.nextTick().

4

1 に答える 1

1

expect(spy).have.been.calledWithスパイが を介して呼び出される前に、テストが呼び出されてspy(result)います。

done私は、期待が失敗したときに初めて呼び出されると仮定します(テストは完了して失敗しました)。次のティックで、コールバックdoneから再度呼び出されgetNounsます。

コールバックに渡された値をチェックするためにスパイは必要ありませんgetNouns。コールバックですぐにアサートを行うことができます。

sinon.stub(Word._wordnik, 'randomWords').yields(null, [
                          {id: 1234, word: "hello"},
                          {id: 2345, word: "foo"},
                          {id: 3456, word: "goodbye"}
                        ]
                      )

Word.getNouns (result) ->
  expect(result).to.deep.equal [
    {id: 1234, word: "hello"},
    {id: 2345, word: "foo"},
    {id: 3456, word: "goodbye"}
  ]
  done()
于 2013-07-19T15:43:10.980 に答える