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