我正在单元测试的一个方法在该方法中多次调用具有不同参数的同一辅助方法。为了测试我的方法,我想使用sinon的replace函数将这个helper方法的返回值替换为我的mock数据,但每次调用那个helper方法都需要返回不同的mock。我该怎么做?
例如:
const obj = {
foo(num) {
return 5 + num;
},
methodToTest() {
return foo(1) + foo(2);
},
};
如果用参数值1调用foo时返回6,用参数值2调用foo返回7,我想测试methodToTest((是否能正常工作。
我想我正在寻找的是一种根据传入的参数替换foo返回值的方法,比如:
sinon.replace(obj, 'foo(1)', sinon.fake.returns(6));
sinon.replace(obj, 'foo(2)', sinon.fake.returns(7));
你知道我该怎么做吗?非常感谢。
只需创建一个伪foo
函数,该函数根据参数动态提供多个返回值。
例如
index.js
:
const obj = {
foo(num) {
return 5 + num;
},
methodToTest() {
return this.foo(1) + this.foo(2);
},
};
module.exports = obj;
index.test.js
:
const obj = require('./');
const sinon = require('sinon');
describe('68463040', () => {
it('should pass', () => {
function fakeFoo(arg) {
if (arg == 1) {
return 6;
}
if (arg == 2) {
return 7;
}
}
sinon.replace(obj, 'foo', fakeFoo);
const actual = obj.methodToTest();
sinon.assert.match(actual, 13);
});
});
测试结果:
68463040
✓ should pass
1 passing (3ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 75 | 100 | 50 | 75 |
index.js | 75 | 100 | 50 | 75 | 3
----------|---------|----------|---------|---------|-------------------