How to test a stub returning a promise in an async test?

javascript, mocha.js, promise, sinon, testing

Solution

You need to call done once all the async operations have finished. When do you think that would be? How would you normally wait until a request is finished?

it('Should test something.', function (done) {

   var req = someRequest,
       mock = sinon.mock(response),
       stub = sinon.stub(someObject, 'method');

    // returns a promise
    stub.withArgs('foo').returns(Q.resolve(5));

    mock.expects('bar').once().withArgs(200);

    request(req, response).then(function(){
       mock.verify();
       done();
    });

});

It might also be a good idea to mark your test as failing in an errorcallback attached to the request promise.

Problem

How can I test this in a async manner? ``` it('Should test something.', function (done) { var req = someRequest, mock = sinon.mock(response), stub = sinon.stub(someObject, 'method'); // returns a promise stub.withArgs('foo').returns(Q.resolve(5)); mock.expects('bar').once().withArgs(200); request(req, response); mock.verify(); }); ``` And here is the method to test. ``` var request = function (req, response) { ... someObject.method(someParameter) .then(function () { res.send(200); }) .fail(function () { res.send(500); }); }; ``` As you can see I am using node.js, Q (for the promise), sinon for mocking and stubbing and mocha as the test environment. The test above fails because of the async behaviour from the request method and I don't know when to call done() in the test.

Original source