Search code examples
javascriptnode.jspromisesinonbluebird

Stubbing a promisified function with sinon and bluebird


In the file I would like to test, I have the following code:

var httpGet = Promise.promisify(require("request").get);
httpGet(endpoint, {
    auth: {bearer: req.body.access_token},
    json: true
})
    .then(...)

Now, in my tests, I want to make sure that httpGet was called once, and make sure the parameters are valid. Before being promisified, my test looked like this:

beforeEach(function () {
    request.get = sinon.stub()
        .yields(null, null, {error: "test error", error_description: "fake google error."});
});

afterEach(function () {
    expect(request.get).to.have.been.calledOnce();
    var requestArgs = request.get.args[0];
    var uri = requestArgs[0];

    expect(uri).to.equal(endpoint);
    //...
});

Unfortunately this no longer works when request.get is promisified. I tried stubbing request.getAsync instead (since bluebird appends "Async" to promisified functions), but that does not work either. Any ideas?


Solution

  • Promise.promisify doesn't modify the object, it simply takes a function and returns a new function, it is completely unaware that the function even belongs to "request".

    "Async" suffixed methods are added to the object when using promisify All

    Promise.promisifyAll(require("request"));
    
    request.getAsync = sinon.stub()
            .yields(null, null, {error: "test error", error_description: "fake google error."});
    
    expect(request.getAsync).to.have.been.calledOnce();