2015-10-22 47 views
2

我試圖在函數(testFunc)上運行單元測試。 testFunc調用我想嘲笑的另一個函數(secondFunc)。我可以嘲笑secondFunc,以便在testFunc的上下文中調用它時,調用了spiedOn版本的secondFunc?如果不是,我應該如何重新格式化我的browserify模塊以使其可測試?使用Jasmine spyOn在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(); 
    }); 

}); 

回答

1

你現在的spyOn與代理更換您返回的對象上secondFunc財產,但你的代碼調用secondFunc功能的方式,在匿名函數的關閉中。有幾種方法可以重構代碼以更好地展示函數。

你可以組織你的模塊是這樣的:

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

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

這是小了很多,更容易閱讀,讓你嘲笑secondFunc功能。

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; 

})();