在javaScript測試框架jasmine介紹(一)中介紹了編寫jasmine測試腳本的語法結構和一些基本的框架特性,在(二)中筆者繼續介紹一些不是十分常用,但在某些場景的測試中可能會用到的框架特性。
先來介紹一下Spies:
Jasmine的測試替身被稱作spies,spy可以保存任何方法及方法參數的調用痕跡。jasmine有特殊的匹配器來保證spies之間的相互作用。
toHaveBeenCalled這個matcher當spy被調用過時返回true。toHaveBeenCalledWith當參數列表匹配上任何一次spy的調用記錄參數時返回true,下圖中其余spc都不難理解,只解釋,foo.setBar.calls.length為調用setBar的次數。
用andReturn和spy鏈接在一起,所有調用這個方法將返回一個特殊的value,如下圖紅框部分
用 andCallFake 和spy鏈接,所有spy的調用都將委托給用戶提供的方法,如下圖紅框部分
當沒有方法能用來spy on,jasmine.createSpy能創建一個空的spy,這個spy和其它spy一樣,能跟蹤調用參數等,但它沒有實現。spies是js對象,可以這樣使用
為了創建各種spies的mock,可以使用jasmine.createSpyObj并傳一個字符串數組作為參數。它返回的是一個對象,每個String都是該對象的一個屬性,成為一個spy,如下圖紅框的4個字符串都是spy
jasmine.any引用構造函數或者類名作為期望值,和真是的構造函數匹配時返回true
jasmine的Mock Clock是一款有效的測試組件,有能力使用setTimeout或者setInterval回調函數。它使timer回調函數同步,使它們更容易測試
通過在spec或者suite里調用jasmine.Clock.useMock來安裝Mock clock。
通過jasmine.Clock.tick方法來標記clock以觸發注冊的回調函數,這個方法傳一個milliseconds.
上面這段話來自對官網的翻譯,一些地方不好理解,筆者對下圖程序做進一步解釋,setTimeout(function() { timerCallback(); }, 100);是一個回調函數,隔100milliseconds調用timerCallback()一次。jasmine.Clock.tick(101)為等待101milliseconds,所以第一次判斷timerCallback是否為調用時為未調用,第二次則已調用。而setInterval(function() { timerCallback(); }, 100)則是每隔100milliseconds調用timerCallback()一次,這樣解釋就不難理解了,第一次判斷調用前等待101milliseconds,所以調用次數為1,第二次判斷調用前又等待50milliseconds,總等待時間為151milliseconds<200milliseconds,所以仍是調用一次,再等待50milliseconds后總等待時間>200milliseconds,所以第三次判斷調用次數就為2
Jasmine支持測試異步操作,通過調用runs定義的一組blocks寫入specs,bolcks通常結束于異步調用。waitsFor block需要一個鎖方法,一個失敗消息,和一個超時時間。鎖方法一直輪詢直到返回true或者超時。如果超時,spec輸出失敗信息。一旦異步狀況出現,另一個runs block定義最終的測試行為,它期望值通?;诋惒秸{用返回的狀態。如下圖,起初flag為false,waitsFor一直輪詢,直到500 milliseconds后觸發setTimeout的function,將flag賦為true后waitsFor在超時時間未到之前結束,waitsFor下面那個runs就是測試行為,筆者看了下value的值為30+。
Jasmine是構建在javaScript之上的,必須包含在一個JS的環境中,如一個web頁面,這樣才能運行。
jasmine的測試文件用javaScript編寫,通過Rocoo被編譯進html(Rocoo這里不做介紹,有興趣的可以自行里了解)。通過
原文轉自:http://www.taobaotest.com/blogs/2267