第120行给handler.handleError方法注入spy后,第121行代码flush HTTP Mock request会触发handler.handleError(的wrap实现)调用。第123行代码检测该方法是否真正被调用过。

首先执行expect(handler.handleError), 给handler.handleError创建一个spec:

实际上调用currentRunnable的expect方法:

this指向spec,actual就是被wrap后的方法。使用expectationFactory根据工厂方法创建一个expectation:



执行matcherCompare:

以下这段检查说明,调用toHaveBeenCalled的对象必须是一个spied method:

判断一个方法是否是spy的逻辑也很简单,使用instanceof:

之前spied method被调用之后,在calls数组里插入了一条数据,因此只要calls数组有元素,都认为spied methhod已经被call过了:


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

Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理相关推荐

  1. Angular jasmine单元测试框架里describe的实现原理

    源代码:describe函数传入的两个参数:描述信息和箭头函数: 从注释能看出,describe函数的语义:Create a group of specs (often called a suite) ...

  2. Angular jasmine单元测试框架里使用it函数定义single spec

    it函数接收两个参数,描述信息和包含了待测试的单元测试代码的函数: /*** Define a single spec. A spec should contain one or more {@lin ...

  3. Angular jasmine单元测试框架里spyOn的创建原理

    准备针对handler的handleError方法创建spy: 保存原始方法的信息到变量originalMetho里: 利用spyFactory.createSpy创建spied版本的新方法: wra ...

  4. Angular单元测试框架里API toHaveBeenCalledTimes的工作原理

    看这样一段代码: let spiedFirstFocusable = spyOn(keyboardFocusService,'findFirstFocusable').and.returnValue( ...

  5. Angular jasmine单元测试框架TestBed.createComponent的实现原理

    单元测试代码里的createComponent,是通过TestBedRender实现的: TestBedRenderer3: 获得注入的TestComponentRenderer: const res ...

  6. Angular jasmine单元测试框架TestBed.inject的执行原理

    单步调试这段代码: TestBed用于单元测试代码里创建Component和service实例. injectionToken即传入TestBed.inject的function: 还是delegat ...

  7. Angular jasmine单元测试框架spec的运行时数据结构

    以我单元测试里这段代码为例: 通过describe函数创建一个suite,即spec的集合: 真正的spec由函数it创建:其中expectable是human readable的字符串描述信息,描述 ...

  8. Angular jasmine单元测试框架spied method的调用记录数据结构

    基于UnknownErrorHandler的handleError方法创建一个spy 方法: 第40行调用的是spied之后的新方法: 因为调用的是Spied之后的wrapper方法,在wrapper ...

  9. Angular jasmine单元测试框架fixture.detectChanges的实现原理

    源代码: fixture的类型是component-fixture,里面会调用_tick方法: 具体执行的detectChange逻辑,取决于Change Detect reference: Root ...

最新文章

  1. Ubuntu下环境变量设置
  2. 静态路由中的下一跳地址和送出接口的区别和使用
  3. Python 下载依赖包环境经常失败超时解决方法
  4. (转载)浏览器兼容性问题大汇总
  5. 【转】flannel网络的VXLAN及host-gw
  6. iloc,ix和loc有何不同?
  7. EF Core 小工具
  8. AddType requires at least two arguments, a mime type followed by one or more file extensions
  9. gSkeletonClu: Revealing Density-Based Clustering Structure from the Core-Connected Tree of a Network
  10. php aes 256 加解密,PHP完整的AES加解密算法使用及例子(256位)
  11. 【信息】三方协议签订相关问题及解答
  12. Self-Supervised Deep Blind Video Super-Resolution
  13. 【量化策略】横盘策略20211209
  14. 计算机教师格言座右铭,教师个人格言座右铭集锦
  15. java查询neo4j_Java中使用neo4j--创建和查询
  16. 部门来了个拿25k出来的00后测试卷王,老油条表示真干不过,已被...
  17. ZZ稻盛和夫:经营为何需要哲学
  18. 2014.10.17 苹果新品发布会(iPad为主)
  19. Python装逼指南——五行代码实现批量抠图
  20. 新北洋SNBC BTP-U81 打印机驱动

热门文章

  1. 源码解读腾讯 GT 的性能测试方案
  2. 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
  3. http://hudeyong926.iteye.com/blog/977152
  4. CentOS6网卡静态IP设置
  5. 个体重构:将重构应用到生活中
  6. ado.net 插入一条数据
  7. linux下c语言 双向链表
  8. DOM加载过程中ready和load的区别
  9. Zookeeper相关知识
  10. vs2013 无法打开 源 文件 SDKDDKVer.h