Search code examples
javascriptunit-testingreactjsreduxsinon

Stubbing method in same file using Sinon


I'm trying to unit test a function in a file while stubbing another function in the SAME file, but the mock is not being applied and the real method is being called. Here's an example:

// file: 'foo.js'

export function a() {
   // .....
}

export function b() { 
   let stuff = a(); // call a
   // ...do stuff
}

And my test:

import * as actions from 'foo';

const aStub = sinon.stub(actions, 'a').returns('mocked return');
actions.b(); // b() is executed, which calls a() instead of the expected aStub()

Solution

  • Some restructuring can make this work.

    I've used commonJS syntax. Should work in the same way in ES6 as well.

    foo.js

    const factory = {
      a,
      b,
    }
    function a() {
      return 2;
    }
    
    function b() {
      return factory.a();
    }
    
    module.exports = factory;
    

    test.js

    const ser = require('./foo');
    const sinon = require('sinon');
    
    const aStub = sinon.stub(ser, 'a').returns('mocked return');
    console.log(ser.b());
    console.log(aStub.callCount);
    

    Output

    mocked return

    1