如何使用 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)
我刚刚开始对 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)