看这样一段代码:

 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里设置断点调试。

  1. 查看传入的actual是否是一个spied后的函数。
  2. 将查看后果设置成默认值false.
  3. 查看传入的冀望调用次数的值的数据类型是否是Number

Spied版本的函数调用明细,存储在CallTracker的calls属性里:

这个数组里蕴含的监控到的办法调用信息有:

  1. 办法调用的输出参数
  2. 调用办法的实例对象
  3. 调用办法的返回参数

"get the number of invocations of this spy"的实现办法:calls.length

如果calls.length和传入的期望值expected相等,阐明匹配胜利,返回success后果:

更多Jerry的原创文章,尽在:"汪子熙":