我正在尝试对函数(testFunc)运行单元测试。 testFunc调用另一个我想模拟的函数(secondFunc)。我可以模拟secondFunc,以便在testFunc的上下文中调用它时,会调用spiedOn版本的secondFunc吗?如果没有,我应该如何重新格式化我的browserify模块以使其可测试?
目前,设置看起来像这样:
app.js(Browserify模块)
module.exports = (function () {
function testFunc() {
secondFunc();
}
function secondFunc(){
console.log('not mocked!');
}
return {
testFunc, secondFunc
};
})();
test.js(茉莉花测试)
describe("testFunc", () => {
let app = require('./app');
beforeEach(() => {
spyOn(app, 'secondFunc');
});
it("should call secondFunc spy", () => {
app.testFunc();
expect(app.secondFunc).toHaveBeenCalled();
});
});
答案 0 :(得分:2)
现在的方式,spyOn
正在用代理替换返回对象上的secondFunc
属性,但是你的代码调用了封闭内的secondFunc
函数。匿名函数。有几种方法可以重构代码以更好地公开函数。
您可以这样构建模块:
exports.testFunc = function() {
exports.secondFunc();
}
exports.secondFunc = function(){
console.log('not mocked!');
}
它更小,更易于阅读,并允许您模拟secondFunc
函数。
答案 1 :(得分:0)
发生这种情况的原因是因为您正在为返回的对象设置模拟,但代码正在调用内部函数。我过去所做的就是这样:
module.exports = (function () {
function testFunc() {
api.secondFunc(); // Call the API function, which is what is mocked
}
function secondFunc(){
console.log('not mocked!');
}
var api = {
testFunc, secondFunc
};
return api;
})();