看这样一段代码:

 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的原创文章,尽在:“汪子熙”:

Angular单元测试框架里API toHaveBeenCalledTimes的工作原理相关推荐

  1. Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理

    第120行给handler.handleError方法注入spy后,第121行代码flush HTTP Mock request会触发handler.handleError(的wrap实现)调用.第1 ...

  2. 红外测距模块工作原理_共享单车里的通讯模块,工作原理是啥呢?

    现在我们所看到了共享单车除了小黄车(OFO)没有配备GPS智能锁外,其他品牌的共享单车都有安装,那么这么高科技的东西具体是怎么工作的呢?下面由我给大家讲解下其中的奥秘. 其实这个东西也谈不上太多高科技 ...

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

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

  4. SAP GUI里Screen Painter的工作原理

    我们在SAP GUI里双击一个screen编号: 单击Layout按钮可以打开Screen Painter: 这背后的工作原理是什么? 是这个RFC destination在起作用: Connecti ...

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

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

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

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

  7. Angular单元测试框架karma-jasmine里类似ABAP unit框架的setup和class_setup方法

    类似ABAP unit框架的setup和class_setup方法: 使用TestBed的工厂方法创建Component: 最后使用工厂方法新建Component实例: 创建好的Component实例 ...

  8. Angular单元测试框架beforeEach和it的执行顺序

    AsyncTestZoneSpec: 然后执行第一个it: 再执行beforeEach的callback: 然后执行第二个it: 由此可见,beforeEach相当于ABAP单元测试的setup方法. ...

  9. ArcGIS教程:克里金法的工作原理(二)

    根据经验半变异函数拟合模型 下一步是根据组成经验半变异函数的点拟合模型.半变异函数建模是空间描述和空间预测之间的关键步骤.克里金法的主要应用是预测未采样位置处的属性值.经验半变异函数可提供有关数据集的 ...

最新文章

  1. 阐述一下Mysql事务的四个特性_数据库事务的四个基本性质?
  2. ocp 工资_【中秋节加班费】2016中秋节加班工资怎么算,中秋节放假加班费的计算方法...
  3. C++ Openssl AES GCM 128bits代码示例,可wins10的visual studio 2017 中直接运行
  4. MethodBase.GetCurrentMethod 方法
  5. SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有问题?
  6. python调用其他程序或脚本方法(转)
  7. 安装mysql5 1步骤_Linux系统安装MySQL详细步骤(mysql-5.1等)
  8. 电商行业最复杂的人货场分析,我用一个案例给你讲清楚
  9. 74HC AHCT LS LV ABT区别
  10. android studio的 gradle 依赖同步错误解决方法
  11. JdbcTemplate实验
  12. SPI总线接口与简单配置
  13. 回答cad转pdf格式的简易方法
  14. 瑞萨单片机-PWM输出
  15. 同行:成长路上的三人行
  16. Linux发行版之间有什么区别?
  17. 爷青回!最近很火的朋友圈怀旧小电视源码来啦!看到最后一个视频我大呼好家伙!
  18. 完美实现Ubuntu系统迁移到另一台电脑/服务器
  19. JAVA基础核心技术总结(2)--基本语法
  20. 成就你一生的100个哲理51-60

热门文章

  1. 为甚么 国企做互联网总做不起来?
  2. fckeditor编辑器自定义加按钮菜单
  3. win2003主/辅DNS服务器详细配置
  4. rabbitmq(四)、消息丢失问题
  5. linux安装redis集群+常见报错
  6. 团队作业6——展示博客(Alpha版本)
  7. spring-mvc里的 mvc:resources 及静态资源访问
  8. asp.net验证码图片生成示例
  9. java.util -- List接口
  10. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...