如何使用 sinon 或 proxyquire 或 rewire 从模拟的非导出函数强制 return 值?

How to force a return value from a mocked non-exported function using sinon or proxyquire or rewire?

我刚刚开始对 nodejs 进行单元测试。我一直在用 mocha、chai 和 sinon。

我想测试一个未导出的函数时遇到了麻烦。 proxyquire looks good, as does rewire.

教程很多,但往往过于简单。例如

// 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('');
  });
});

虽然这很好,但我希望能够将函数 saySecret 强制为 return 特定值。原因是该函数被 is 导出的函数调用,我想对外部函数进行单元测试,迫使它走上失败路径.

如何用 sinon/proxyquire/rewire 做到这一点?

rewire包的APIrewiredModule.set(name: String, value: *): Function可以做到这一点。

例如

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);
  });
});

测试结果:

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



  71285081
    ✓ should pass (86ms)


  1 passing (90ms)