I am using Mocha to test some Node.js code and want to use process.nextTick() to call a callback of a method.
@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"}
]
For some reason I am getting a done() was called twice error when I run mocha. If I run the callback outside of process.nextTick().
Your test is calling expect(spy).have.been.calledWith before the spy was called via spy(result).
I assume that when the expect fails, done is called for the first time (the test is done and failed). In the next tick, done is called again from your getNouns callback.
You don't need the spy to check the value passed to getNouns callback, you can do the assert immediately in the callback.
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()