簡體   English   中英

在sinon.js中拼寫和/或嘲弄一個班級?

[英]Stubbing and/or mocking a class in sinon.js?

我為我的應用程序創建了一個數據庫包裝器,如下所示。 為了測試它,我顯然想要替換實際的數據庫庫。 我可以創建一個新類來sinon.js query方法並捕獲所有輸入,但使用sinon.js似乎更合適,但我如何使用它?
sinon.jsmockstub功能是我應該使用的嗎?

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;

(斷言使用chaisinon-chai

我說只是“運用它”,因為這段代碼片段不是實際的單元測試。 實例化和方法調用將由您的受試者進行。

現在,如果你想在你的例子中模擬一個由require()注入的依賴項 - 例如db = require('database') ,你可以嘗試一個測試工具,比如Jest (但不使用sinon)或者我創建的sinonquire靈感來自於Jest,但是它與sinon以及你最喜歡的測試工具一起使用(我的是mocha )。 在內部, sinonquire使用上面顯示的將sinon.spysinon.createStubInstance組合sinon.spy一個類的相同技術。

你可以同時使用它們。

模擬有一個預期的有序行為,如果沒有正確遵循,將會給你一個錯誤。

Stub類似於mock,但沒有訂單,所以你可以按照你想要的方式調用你的方法。 根據我的經驗,你幾乎不需要模擬。

它們都將用你的方法替換一個空方法,或者如果你傳遞一個閉包。 它會是這樣的:

stub = sinon.stub(wrapper , 'insertUser ', function () { return true; });

然后添加expect行為以檢查它是否確實發生過。

我喜歡用JasmineJasmine-Sinon來檢查測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM