使用Jasmine spyOn模拟Browserify模块中的函数
我正在尝试对函数(testFunc)运行单元测试。testFunc调用另一个我想模拟的函数(secondFunc)。我可以模拟secondFunc,以便在testFunc上下文中调用它时,调用secondFunc的spiedOn版本吗?如果不是,我应该如何重新设置browserify模块的格式以使其可测试 目前,安装程序如下所示:使用Jasmine spyOn模拟Browserify模块中的函数,jasmine,browserify,Jasmine,Browserify,我正在尝试对函数(testFunc)运行单元测试。testFunc调用另一个我想模拟的函数(secondFunc)。我可以模拟secondFunc,以便在testFunc上下文中调用它时,调用secondFunc的spiedOn版本吗?如果不是,我应该如何重新设置browserify模块的格式以使其可测试 目前,安装程序如下所示: module.exports = (function () { function testFunc() { api.secondFunc();
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;
})();
app.js(浏览模块)
test.js(茉莉花测试)
发生这种情况的原因是,您正在对返回的对象设置模拟,但代码正在调用内部函数。我过去所做的是这样的:
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;
})();
按照现在的方式,
spyOn
正在用代理替换返回对象上的secondFunc
属性,但是您的代码调用匿名函数闭包内的secondFunc
函数。有几种方法可以重组代码以更好地公开函数
您可以这样构造模块:
exports.testFunc = function() {
exports.secondFunc();
}
exports.secondFunc = function(){
console.log('not mocked!');
}
它更小,更容易阅读,并且可以模拟secondFunc
函数
exports.testFunc = function() {
exports.secondFunc();
}
exports.secondFunc = function(){
console.log('not mocked!');
}