使用Jasmine spyOn模拟Browserify模块中的函数

使用Jasmine spyOn模拟Browserify模块中的函数,jasmine,browserify,Jasmine,Browserify,我正在尝试对函数(testFunc)运行单元测试。testFunc调用另一个我想模拟的函数(secondFunc)。我可以模拟secondFunc,以便在testFunc上下文中调用它时,调用secondFunc的spiedOn版本吗?如果不是,我应该如何重新设置browserify模块的格式以使其可测试 目前,安装程序如下所示: module.exports = (function () { function testFunc() { api.secondFunc();

我正在尝试对函数(testFunc)运行单元测试。testFunc调用另一个我想模拟的函数(secondFunc)。我可以模拟secondFunc,以便在testFunc上下文中调用它时,调用secondFunc的spiedOn版本吗?如果不是,我应该如何重新设置browserify模块的格式以使其可测试

目前,安装程序如下所示:

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!');
}