Sinon

Sinon.js是個測試輔助工具,在爲Node程序寫測試時可能能夠派上用場。 在測試領域有這麼幾個基本名詞:spy, stub, mock,這三個概念都是測試所用到的手段。Sinon.js就提供了相應的工具來實現這三種測試手段。app

sinon.stub() 完成後必定要sinon.restore(),不然會影響其餘的測試ide

spy

spy的做用在於能夠監視一個函數被調用的狀況。spy至關於給咱們感興趣的函數加了一層wrapper,因而記錄下了這個函數被調用過幾回,每次傳入的參數是什麼以及每次返回的結果是什麼,或是拋出了怎樣的異常。函數

var sinon = require("sinon");
sinon.spy(crawler, "launch"); // 監視crawler.launch,這是個function

// 對crawler.launch進行調用

crawler.launch.callCount > 1; // 該函數的調用次數
crawler.launch.withArgs("...").calledOnce; // 該函數是否以...參數調用過一次

crawler.launch.restore(); // 消除監視(測完換回去)

stub

測試中有可能遇到這樣的情形:測試函數f1,f1依賴於函數f2,咱們須要測試f1在f2的不一樣表現之下有怎樣的表現。可是讓f2有不一樣的表現可能會很不容易,有可能須要複雜的配置或是精巧的捏造,或是f2出現某種表現的概率很小等等。這時stub就可派上用場,stub就是人爲設定的f2的替代品。咱們能夠設定stub在怎樣的輸入下有怎樣特定的表現,從而再也不阻礙對f1的測試。工具

var sinon = require("sinon");

var stub = sinon.stub(); // 建立一個stub
var stub = sinon.stub(ab, "f"); // 將ab.f替換成一個stub,使用完畢後須要調用stub.restore()或ab.f.restore()來複原
var stub = sinon.stub(ab, "f", function(...) {...}); // 將ab.f替換成指定的函數

stub.returns(10);
stub(); // stub()老是返回10

stub.throws("...");
stub(); // stub()老是拋出"..."

stub.withArgs(1).returns(10);
stub(1); // stub(1)會返回10

stub.restore();

在Sinon.js中,stub自己也是個spy,因此能夠在stub上調用以前提到的 .callCount 等查看函數調用狀況。測試

mock

mock在Sinon.js中用於對一個object的活動進行監視。一個object被mock之後,就能夠設定咱們對這個object有怎樣的預期。這裏的預期例如:某方法被調用了多少次(或至少至多多少次)、某方法必定沒被調用、某方法被輸入怎樣的參數來調用、等等。能夠看出mock對一個object的監視相似於spy對一個函數的監視。二者的關鍵區別在於使用場景,spy客觀地監視了一個函數的表現,對這個函數的調用都真正執行了。而mock出的object收到了數據或是調用並無真正執行,一切針對mock的調用都是假的。因此mock能夠用來測試具備side effect的函數,這裏的side effect泛指和外部對象有數據交互或者是調用,好比調用外部對象的方法、向server發送數據、和UI對象有交互、寫日誌等等。ui

var sinon = require("sinon");

var obj = {
  ...
};

var mock = sinon.mock(obj);
mock.expect("f").atLeast(2).withArgs(10); // obj.f(10)調用至少出現過2次

...

mock.verify(); // 測試此時的obj是否知足上面的mock設定條件
mock.restore();

其餘問題

  • Sinon.js提供了模擬時間流逝的功能,但彷佛並很差用。對於定時事件的觸發會產生怎樣的影響,仍是先寫點測試代碼看清楚結果再用爲好。
  • Sinon.js對Ajax call相關的測試也提供了模擬功能。
相關文章
相關標籤/搜索