2014-12-03 95 views
2

如何使用sinon.js來模擬/間諜對象內提到的JavaScript函數? 所提到的對象也進行方法調用,我需要測試該方法是否被該對象調用。如何使用sinon.js在JavaScript函數中提到的模擬/間諜對象?

任何幫助將不勝感激。

感謝萬提前!

等待任何迴應。

var ABCClient = require('ABCClient'); 
var connect = function(){ 
    var client; 
    client = new ABCClient(); //instantiating object 

    client.on('some parameter'); // Test if the `on` event is called. 
} 
+0

是否有您想要處理的特定情況? (即代碼示例)。如果它只是該功能的局部範圍的一個對象,那麼這將是相當困難的。但是一個代碼示例對我來說是一個很好的開始,可以提出一個建議。 @ user3785790 – lwang135 2014-12-03 19:53:58

+0

@ lwang135感謝您回覆。該對象位於該函數的範圍內。在我的問題中添加上面代碼的示例代碼片段。 謝謝你看看。 等待任何迴應。 – Harsh 2014-12-04 10:52:59

+0

'client'只能在分配給'connect'的匿名函數中訪問。您需要公開公開該對象以窺探它,例如把它作爲調用'connect()'的返回值。 – user2943490 2014-12-04 11:19:54

回答

3

看着你的模擬。一旦你退後一步思考,這是相當直接的。您正在創建一個類的實例。只要做到這一點:

var ABCClient = require('ABCClient'); 

describe('test', function() { 
    it('some test', function() { 
    var stub = sinon.stub(ABCClient.prototype, 'on').yields('return object'); 
    assert.ok(stub.calledWith('Parameter')); 
    ABCClient.prototype.on.restore(); 
    }); 
}); 

或者,你可以只使用spy超過stub,如果你只是想在它的間諜不改變行爲。

在本示例中,您正在對prototype進行存根操作,以便所有實例都擁有該屬性/方法存根。因此,您將能夠訪問該對象。試試看,讓我知道。

+0

@ Iwang135:這很棒。我會嘗試你所提到的,並給你留言。 感謝您的代碼示例。我不熟悉這種測試。 我會試試這個,讓你知道。 乾杯。 – Harsh 2014-12-04 17:05:34

+0

@Harsh其實,我打字太快了。有幾件事要做(我會更新答案)。 1.如果你想維護現有的功能,可以使用'spy';如果你想保存現有的功能,可以使用'stub',但是確保你返回/產生一些東西。 2.確保你在測試後恢復它。 – lwang135 2014-12-04 17:18:25

+0

@Harsh這項工作? – lwang135 2014-12-05 21:09:34

相關問題