看这样一段代码:
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 里设置断点调试。
- 查看传入的 actual 是否是一个 spied 后的函数。
- 将查看后果设置成默认值 false.
- 查看传入的冀望调用次数的值的数据类型是否是 Number
Spied 版本的函数调用明细,存储在 CallTracker 的 calls 属性里:
这个数组里蕴含的监控到的办法调用信息有:
- 办法调用的输出参数
- 调用办法的实例对象
- 调用办法的返回参数
“get the number of invocations of this spy” 的实现办法:calls.length
如果 calls.length 和传入的期望值 expected 相等,阐明匹配胜利,返回 success 后果:
更多 Jerry 的原创文章,尽在:” 汪子熙 ”: