Angular单元测试框架里API toHaveBeenCalledTimes的工作原理
看這樣一段代碼:
let spiedFirstFocusable = spyOn(keyboardFocusService,'findFirstFocusable').and.returnValue(el);fixture.detectChanges();expect(document.activeElement.id).toEqual('a');expect(spiedFirstFocusable).toHaveBeenCalledTimes(ELEMENT_FOCUSED_TIME);spiedFirstFocusable是spyOn方法針對實例keyboardFocusService的findFirstFocusable方法進行監(jiān)控后返回的句柄。借助該句柄,我們可以使用toHaveBeenCalledTimes方法,得到其在單元測試過程中實際調(diào)用的次數(shù)。
expect方法:基于傳入的spec創(chuàng)建一個expectation. 在我們的例子里,傳入的spec就是keyboardFocusService.findFirstFocusable被spy之后的版本:
Expectation通過工廠方法創(chuàng)建,該工廠方法接受兩個參數(shù),第一個參數(shù)為spied method handle:
第二個參數(shù)為單元測試代碼運行的spec信息,即下圖高亮代碼:
Expectation工廠方法的實現(xiàn)細節(jié),我們可以略過:
toHaveBeenCalledTimes的函數(shù)體是之前wrapSyncCompare包裹函數(shù)返回的一個閉包:
待compare的業(yè)務(wù)邏輯寫在函數(shù)matcherFactory里:
以后我們可以直接在函數(shù)toHaveBeenCalledTimes里設(shè)置斷點調(diào)試。
Spied版本的函數(shù)調(diào)用明細,存儲在CallTracker的calls屬性里:
這個數(shù)組里包含的監(jiān)控到的方法調(diào)用信息有:
"get the number of invocations of this spy"的實現(xiàn)方法:calls.length
如果calls.length和傳入的期望值expected相等,說明匹配成功,返回success結(jié)果:
更多Jerry的原創(chuàng)文章,盡在:“汪子熙”:
總結(jié)
以上是生活随笔為你收集整理的Angular单元测试框架里API toHaveBeenCalledTimes的工作原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉利副总裁杨学良:中国豪华纯电品牌总要有
- 下一篇: SAP中国招聘内部顾问,工作职责是做客户