Stefan
Stefan

Reputation: 749

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

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.

Upvotes: 12

Views: 18090

Answers (2)

Łukasz Rzeszotarski
Łukasz Rzeszotarski

Reputation: 6140

Working solution in Typescript:

 var returnPromise = myService.method()
    returnPromise.done(() => {
        mock.verify()
    })

Upvotes: 1

Frances McMullin
Frances McMullin

Reputation: 5706

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.

Upvotes: 7

Related Questions