2015-09-02 61 views
0

我得到一個sinon存根要返回/解決另一個sinon存根時出現問題。我正在使用sinon,chai,chai-as-promised和mocha。從一個sinon存根返回一個sinon存根

我表演的序列號的異步任務,我想測試看起來像這樣的代碼:

Terminal.findOneAsync({terminalId: terminalId}).then(function(terminal) { 
    terminal.lastSeen = timestamp; 
    return terminal.saveit(); 
}).then(function(terminal) { 
//continue to do other stuff 
}); 

而我試圖在這個看起來像這樣創建存根:

var saveitStub = sinon.stub(Terminal.prototype, 'saveit'); 
saveitStub.resolves(terminalUpdated); 
var findOneStub = sinon.stub(Terminal, 'findOneAsync'); 
findOneStub.resolves(saveitStub); 

「saveit」方法在Terminal.prototype中,這就是爲什麼我需要在那裏存根。 當我試圖運行此我得到的錯誤:

Unhandled rejection TypeError: undefined is not a function 

在該行:

return terminal.saveit(); 

但如果我傾倒的終端對象從控制檯它看起來不錯,就像任何其他存根對象(至少對我簡單的頭腦)。在測試中,可以將存根(save)()方法稱爲「獨立」。但是每當我通過柴的「迴歸」或柴 - 答應的「解決」方法返回它時,我都會遇到這個錯誤。

任何想法爲什麼這種情況?

回答

0

這條線:

findOneStub.resolves(saveitStub) 

導致Terminal.findOneAsync返回一個存根函數,而不是一個終端實例。顯然,存根函數沒有名爲saveit的屬性,儘管Terminal.prototype的確如此。由於未知屬性會以undefined的形式返回,因此您會嘗試調用undefined作爲函數。

爲了進行這樣的測試,您可能更適合構建Terminal的實例並將其saveit方法存根。如果無論出於何種原因構建實例太困難,可以使用sinon.createStubInstance。由於我不知道你的構造函數的簽名,我將繼續並以此爲例:

var terminal = sinon.createStubInstance(Terminal); 
var saveitStub = terminal.saveit 
saveitstub.resolves(terminalUpdated) 
var findOneStub = sinon.stub(Terminal, 'findOneAsync') 
findOneStub.resolves(terminal);