10

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
}
agoldis
  • 1,067
  • 16
  • 28

3 Answers3

3

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

mikey
  • 1,339
  • 5
  • 22
  • 43
1

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

agoldis
  • 1,067
  • 16
  • 28
1

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;
}
Allan Juan
  • 2,048
  • 1
  • 18
  • 42