[英]Stubbing and/or mocking a class in sinon.js?
我為我的應用程序創建了一個數據庫包裝器,如下所示。 為了測試它,我顯然想要替換實際的數據庫庫。 我可以創建一個新類來sinon.js
query
方法並捕獲所有輸入,但使用sinon.js
似乎更合適,但我如何使用它?
sinon.js
的mock
或stub
功能是我應該使用的嗎?
wrapper = (function() {
function wrapper() {}
wrapper.db = require("database");
wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return wrapper;
})();
首先,我稍微修改一下你的類定義(大寫的類名和修復數據庫賦值):
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
要整個班級:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
將創建一個Wrapper實例,其中每個方法都是一個存根。 sinon.spy
將允許我們窺探類的實例化。
所以你可以像這樣鍛煉它:
// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;
// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;
(斷言使用chai和sinon-chai )
我說只是“運用它”,因為這段代碼片段不是實際的單元測試。 實例化和方法調用將由您的受試者進行。
現在,如果你想在你的例子中模擬一個由require()注入的依賴項 - 例如db = require('database')
,你可以嘗試一個測試工具,比如Jest (但不使用sinon)或者我創建的sinonquire靈感來自於Jest,但是它與sinon以及你最喜歡的測試工具一起使用(我的是mocha )。 在內部, sinonquire使用上面顯示的將sinon.spy
和sinon.createStubInstance
組合sinon.spy
一個類的相同技術。
你可以同時使用它們。
模擬有一個預期的有序行為,如果沒有正確遵循,將會給你一個錯誤。
Stub類似於mock,但沒有訂單,所以你可以按照你想要的方式調用你的方法。 根據我的經驗,你幾乎不需要模擬。
它們都將用你的方法替換一個空方法,或者如果你傳遞一個閉包。 它會是這樣的:
stub = sinon.stub(wrapper , 'insertUser ', function () { return true; });
然后添加expect行為以檢查它是否確實發生過。
我喜歡用Jasmine和Jasmine-Sinon來檢查測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.