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

时间:2015-10-22 16:33:52

标签: jasmine browserify

我正在尝试对函数(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();
    });

});

2 个答案:

答案 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;

})();