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

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

app.js(浏览器模块)

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();
    });

});

最佳答案

您现在拥有的方式是,spyOn用代理替换返回对象上的secondFunc属性,但是您的代码调用了匿名函数闭包内的secondFunc函数。有几种方法可以重组代码以更好地公开功能。

您可以通过以下方式构建模块:

exports.testFunc = function() {
    exports.secondFunc();
}

exports.secondFunc = function(){
    console.log('not mocked!');
}


它更小,更易于阅读,并且可以模拟secondFunc函数。

10-05 22:52