2017-08-11 58 views
0

我試圖模擬一個節點模塊內的功能。但它不允許我。有任何想法嗎?試圖存根節點模塊內使用的方法

// module A 

function foo(){ 
    return 1; 
} 

function bar(){ 
    return foo() + 1; 
} 

module.exports = {foo, bar} 

在測試中...

const a = require('a'); 
... 
sinon.stub(a, 'foo').callsFake(() => 3); 
expect(a.bar()).to.equal(4); // gets 2 instead of 4 

回答

2

由於路興農你實際上有一個有趣的情況落得個模塊中的存根功能。你的功能實際上是被釘住的,但是隻能在module.exports.foo被釘住。您的原始功能foo未更改。基本上Sinon所做的就是用它們的特殊功能包裝你的module.exports.{function}

如果要在bar函數中保留任何存根,則需要在exports對象上引用foo,而不是直接引用foo

function bar() { 
    return module.exports.foo() + 1; 
} 

祝你好運:)

編輯:通常當我想要做這樣的事情,我寫我的模塊,並使用其功能這樣...

// module A 

exports.foo = function foo() { 
    return 1; 
} 

exports.bar = function bar() { 
    return exports.foo() + 1; 
} 

這樣如果模塊中的任何內容被取消/模擬/窺探,它將應用於模塊內部的所有其他調用。但總的來說,我的建議是,如果你打算永遠計劃存儲一個你不想直接從任何地方引用它的函數。您需要通過對象引用這些函數,以便Sinon可以在對象上執行替換。

+0

工作!謝謝 – Adrian

+0

不用擔心!我添加了一個替代方案,您可以在模塊中嘗試。當我需要在模塊中存儲函數時,我發現它總是適用於我。 –