摘要:完成后一定要否則會影響其他的測試的作用在于可以監(jiān)視一個函數(shù)被調(diào)用的情況。在中用于對一個的活動進(jìn)行監(jiān)視。而出的收到了數(shù)據(jù)或是調(diào)用并沒有真正執(zhí)行,一切針對的調(diào)用都是假的。對相關(guān)的測試也提供了模擬功能。
Sinon.js是個測試輔助工具,在為Node程序?qū)憸y試時可能可以派上用場。 在測試領(lǐng)域有這么幾個基本名詞:spy, stub, mock,這三個概念都是測試所用到的手段。Sinon.js就提供了相應(yīng)的工具來實現(xiàn)這三種測試手段。
sinon.stub() 完成后一定要sinon.restore(),否則會影響其他的測試
spyspy的作用在于可以監(jiān)視一個函數(shù)被調(diào)用的情況。spy相當(dāng)于給我們感興趣的函數(shù)加了一層wrapper,于是記錄下了這個函數(shù)被調(diào)用過幾次,每次傳入的參數(shù)是什么以及每次返回的結(jié)果是什么,或是拋出了怎樣的異常。
var sinon = require("sinon"); sinon.spy(crawler, "launch"); // 監(jiān)視crawler.launch,這是個function // 對crawler.launch進(jìn)行調(diào)用 crawler.launch.callCount > 1; // 該函數(shù)的調(diào)用次數(shù) crawler.launch.withArgs("...").calledOnce; // 該函數(shù)是否以...參數(shù)調(diào)用過一次 crawler.launch.restore(); // 消除監(jiān)視(測完換回去)stub
測試中有可能遇到這樣的情形:測試函數(shù)f1,f1依賴于函數(shù)f2,我們需要測試f1在f2的不同表現(xiàn)之下有怎樣的表現(xiàn)。但是讓f2有不同的表現(xiàn)可能會很不容易,有可能需要復(fù)雜的配置或是精巧的捏造,或是f2出現(xiàn)某種表現(xiàn)的幾率很小等等。這時stub就可派上用場,stub就是人為設(shè)定的f2的替代品。我們可以設(shè)定stub在怎樣的輸入下有怎樣特定的表現(xiàn),從而不再阻礙對f1的測試。
var sinon = require("sinon"); var stub = sinon.stub(); // 創(chuàng)建一個stub var stub = sinon.stub(ab, "f"); // 將ab.f替換成一個stub,使用完畢后需要調(diào)用stub.restore()或ab.f.restore()來復(fù)原 var stub = sinon.stub(ab, "f", function(...) {...}); // 將ab.f替換成指定的函數(shù) 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上調(diào)用之前提到的 .callCount 等查看函數(shù)調(diào)用情況。
mockmock在Sinon.js中用于對一個object的活動進(jìn)行監(jiān)視。一個object被mock以后,就可以設(shè)定我們對這個object有怎樣的預(yù)期。這里的預(yù)期例如:某方法被調(diào)用了多少次(或至少至多多少次)、某方法一定沒被調(diào)用、某方法被輸入怎樣的參數(shù)來調(diào)用、等等??梢钥闯鰉ock對一個object的監(jiān)視類似于spy對一個函數(shù)的監(jiān)視。兩者的關(guān)鍵區(qū)別在于使用場景,spy客觀地監(jiān)視了一個函數(shù)的表現(xiàn),對這個函數(shù)的調(diào)用都真正執(zhí)行了。而mock出的object收到了數(shù)據(jù)或是調(diào)用并沒有真正執(zhí)行,一切針對mock的調(diào)用都是假的。所以mock可以用來測試具有side effect的函數(shù),這里的side effect泛指和外部對象有數(shù)據(jù)交互或者是調(diào)用,比如調(diào)用外部對象的方法、向server發(fā)送數(shù)據(jù)、和UI對象有交互、寫日志等等。
var sinon = require("sinon"); var obj = { ... }; var mock = sinon.mock(obj); mock.expect("f").atLeast(2).withArgs(10); // obj.f(10)調(diào)用至少出現(xiàn)過2次 ... mock.verify(); // 測試此時的obj是否滿足上面的mock設(shè)定條件 mock.restore();其他問題
Sinon.js提供了模擬時間流逝的功能,但似乎并不好用。對于定時事件的觸發(fā)會產(chǎn)生怎樣的影響,還是先寫點測試代碼看清楚結(jié)果再用為好。
Sinon.js對Ajax call相關(guān)的測試也提供了模擬功能。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92610.html
摘要:現(xiàn)在,我們可以使用單元測試來提高自己的代碼質(zhì)量。它在單元測試的編寫中通常用來模擬等相關(guān)請求。通過這篇文章,你應(yīng)該學(xué)會了如何針對已有代碼從零開始編寫一套完整的單元測試用例。 概述 在日常的功能開發(fā)中,我們的代碼測試都依賴于自己或者QA進(jìn)行測試。這些操作不僅費時費力,而且還依賴開發(fā)者自身的驅(qū)動。在開發(fā)一些第三方依賴的庫時,我們也沒有辦法給第三方提供完整的代碼質(zhì)量報告。 現(xiàn)在,我們可以使用單...
摘要:使用集成單元測試上項目地址安裝依賴測試框架可視化報表覆蓋率替換依賴斷言命令命令命令執(zhí)行單元測試,并打開測試報告頁面和覆蓋率頁面執(zhí)行生成單元測試覆蓋率并打開執(zhí)行單個單元測試文 使用 mocha 集成單元測試(上) 項目地址:https://github.com/Jay-tian/j... 安裝依賴 yarn add jquery mocha mochawesome istanbu...
摘要:基本上,測試金字塔描述你應(yīng)該編寫單元測試集成測試和端到端測試。集成測試要比端到端測試多,單元測試甚至要更多一些。應(yīng)用程序單元測試編寫單元測試,是為了看看給定的模塊單元是否工作。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1754原文:https://blog.risingstack.com/node-hero-node-js-un...
摘要:加上測試覆蓋率檢查,就能夠提供足夠的信息,來斷言代碼的行為是否符合期望。測試的相關(guān)技術(shù)是程序的代碼覆蓋率工具,以土耳其最大城市伊斯坦布爾命名。 showImg(https://segmentfault.com/img/remote/1460000010260434); 敏捷軟件開發(fā)中,最重要實踐的就是測試驅(qū)動開發(fā),在單元測試層面,我們試著實現(xiàn)一個重要的指標(biāo)就是測試覆蓋率。測試覆蓋率衡量...
摘要:但是,項目中的一些公共封裝,比如公共的組件公用的功能模塊等是可以使用單元測試的。因此特為組件庫引入單元測試,目的在于能減少組件的,避免重復(fù)的發(fā)布不必要的包。 項目github地址:https://github.com/yuanalina/installAsRequired這里必須要提前說明,前端項目的單元測試不是必須的,特別是業(yè)務(wù)型項目,增加單元測試反而會成為累贅,增加開發(fā)成本且無意義...
閱讀 3562·2021-08-31 09:39
閱讀 1869·2019-08-30 13:14
閱讀 2932·2019-08-30 13:02
閱讀 2778·2019-08-29 13:22
閱讀 2356·2019-08-26 13:54
閱讀 778·2019-08-26 13:45
閱讀 1597·2019-08-26 11:00
閱讀 990·2019-08-26 10:58