agoldis
agoldis

Reputation: 1067

Stubbing non-exported function with sinon

I write a unit-test for doB function of my module.

I want to stub the function doA without exporting it, I prefer not change the way doB accesses doA.

I understand that it cannot be simply stubed because it isnt in the exported object.

How do I stub doA (sinon or any other tool?)

function doA (value) {
   /* do stuff */
}

function doB (value) {
  let resultA = doA(value);
  if (resultA === 'something') {
     /* do some */
  } else {
     /* do otherwise */
  }
}

module.exports = exports = {
   doB
}

Upvotes: 10

Views: 6522

Answers (3)

Allan Juan
Allan Juan

Reputation: 2554

Actually, if you don't care about fetching the original function, but rather just want to stub it, the first part is unnecessary. You can do something like this instead:

function stubPrivateMethod(modulePath, methodName) {
    const module = rewire(modulePath);
    
    const stub = sinon.stub();

    module.__set__(methodName, stub);

    return stub;
}

Upvotes: 1

mikey
mikey

Reputation: 1460

I did it using rewire too. This is what I came up with

const demographic = rewire('./demographic')

const getDemographicsObject = { getDemographics: demographic.__get__('getDemographics') };

const stubGetDemographics = sinon
 .stub(getDemographicsObject, 'getDemographics')
 .returns(testScores);

demographic.__set__('getDemographics', stubGetDemographics);

Hope this helps

Upvotes: 3

agoldis
agoldis

Reputation: 1067

I've ended up using rewire, I can either just __get__ an internal function from the module and the stub it with sinon or userewire's __with__ utility to invoke a function with replaced internal values

Upvotes: 1

Related Questions