Sinon.js是個測試輔助工具,在爲Node程序寫測試時可能能夠派上用場。 在測試領域有這麼幾個基本名詞:spy, stub, mock,這三個概念都是測試所用到的手段。Sinon.js就提供了相應的工具來實現這三種測試手段。app
sinon.stub() 完成後必定要sinon.restore(),不然會影響其餘的測試ide
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(); // 消除監視(測完換回去)
測試中有可能遇到這樣的情形:測試函數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在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();