我有函数A,它从函数B获取一个值并将其与一个字符串进行比较。如果匹配则返回true,否则返回false。
function A(random) {
var something = B();
if (random === something) {
return true;
} else {
return false;
}
}
function B() {
var something = 'hello';
return something;
}
我的测试看起来像这样
test("Test ", function () {
//Arrange
var expected = true;
var random = "hi";
var B = sinon.stub();
B.returns(random);
//Act
var actual = A('hi');
//Assert
deepEqual(actual, expected);
});
我已经成功删除了函数B,使用Sinon返回我选择的值。当我在测试中直接调用函数B时它返回存根值,但是当我调用函数A时它不再返回存根值,任何想法为什么?
答案 0 :(得分:1)
您实际上并不是A
或B
函数,只是创建一个具有相同名称的新本地函数。
如果要注入(替换)函数函数,则必须以更加测试驱动的方式重构代码(即使用对象,没有本地函数,dependency inversion ...)。
或者使用像rewire
这样的工具来修改本地模块范围变量并注入存根/伪造变量。
即
// same as require, but create a new copy (not cached)
// with __set__ and __get__ methods:
var myModule = rewire('./myModule')
, stubbedB = sinon.stub();
myModule.__set__("B", stubbedB);
myModule.__get__("A");
答案 1 :(得分:0)
您可以进行一些重构,以便不需要rewire
之类的任何其他软件包。
例如
index.js
:
function A(random) {
const something = exports.B();
if (random === something) {
return true;
} else {
return false;
}
}
function B() {
const something = 'hello';
return something;
}
exports.A = A;
exports.B = B;
index.test.js
:
const mod = require('./');
const sinon = require('sinon');
const { expect } = require('chai');
describe('39266915', () => {
afterEach(() => {
sinon.restore();
});
it('should return true', () => {
sinon.stub(mod, 'B').returns('hi');
const actual = mod.A('hi');
expect(actual).to.be.true;
});
it('should return false', () => {
sinon.stub(mod, 'B').returns('hello');
const actual = mod.A('hi');
expect(actual).to.be.false;
});
});
具有覆盖率报告的单元测试结果:
39266915
✓ should return true
✓ should return false
2 passing (9ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 75 | 100 | 50 | 75 |
index.js | 75 | 100 | 50 | 75 | 11,13
----------|---------|----------|---------|---------|-------------------
源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/39266915