0

I am just getting started unit testing nodejs. I have been using mocha, chai and sinon.

I hit a snag when I wanted to test a function which is not exported. proxyquire looks good, as does rewire.

There are lots of tutorials, but they tend to be simplistic. E.g

// Software under test
function saySecret() {      // this function is *not* exported
  return '';
}

// Unit test file
import utilsRewire from './utils.js';

describe('saySecret', () => {
  it('returns shh emoji', () => {
    const saySecret = utilsRewire.__get__('saySecret'); //  the secret sauce

    expect(saySecret()).toBe('');
  });
});

While that is nice, I want to be able to force the function saySecret to return a specific value. The reason being that the function is called by a function which is exported, and I want to unit test the outer function, forcing it down failure paths.

How can I do that with sinon/proxyquire/rewire?

4

1 回答 1

1

The API rewiredModule.set(name: String, value: *): Function of rewire package can do this.

E.g.

index.ts:

function saySecret() {
  return '';
}

export function outer() {
  return saySecret();
}

index.test.ts:

import rewire from 'rewire';
import sinon from 'sinon';

describe('71285081', () => {
  it('should pass', () => {
    const mod = rewire('./');
    const saySecretStub = sinon.stub().returns('Ok');
    mod.__set__('saySecret', saySecretStub);
    const actual = mod.outer();
    sinon.assert.match(actual, 'Ok');
    sinon.assert.calledOnce(saySecretStub);
  });
});

Test result:

mocha --require ts-node/register --require jsdom-global/register --timeout 5000 "index.test.ts"



  71285081
    ✓ should pass (86ms)


  1 passing (90ms)
于 2022-02-28T03:18:59.187 回答