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里设置断点调试。
- 检查传入的actual是否是一个spied后的函数。
- 将检查结果设置成默认值false.
- 检查传入的期望调用次数的值的数据类型是否是Number
Spied版本的函数调用明细,存储在CallTracker的calls属性里:
这个数组里包含的监控到的方法调用信息有:
- 方法调用的输入参数
- 调用方法的实例对象
- 调用方法的返回参数
"get the number of invocations of this spy"的实现方法:calls.length
如果calls.length和传入的期望值expected相等,说明匹配成功,返回success结果:
更多Jerry的原创文章,尽在:“汪子熙”:
Angular单元测试框架里API toHaveBeenCalledTimes的工作原理相关推荐
- Angular jasmine单元测试框架里expect.toHaveBeenCalled的工作原理
第120行给handler.handleError方法注入spy后,第121行代码flush HTTP Mock request会触发handler.handleError(的wrap实现)调用.第1 ...
- 红外测距模块工作原理_共享单车里的通讯模块,工作原理是啥呢?
现在我们所看到了共享单车除了小黄车(OFO)没有配备GPS智能锁外,其他品牌的共享单车都有安装,那么这么高科技的东西具体是怎么工作的呢?下面由我给大家讲解下其中的奥秘. 其实这个东西也谈不上太多高科技 ...
- Angular jasmine单元测试框架里describe的实现原理
源代码:describe函数传入的两个参数:描述信息和箭头函数: 从注释能看出,describe函数的语义:Create a group of specs (often called a suite) ...
- SAP GUI里Screen Painter的工作原理
我们在SAP GUI里双击一个screen编号: 单击Layout按钮可以打开Screen Painter: 这背后的工作原理是什么? 是这个RFC destination在起作用: Connecti ...
- Angular jasmine单元测试框架里使用it函数定义single spec
it函数接收两个参数,描述信息和包含了待测试的单元测试代码的函数: /*** Define a single spec. A spec should contain one or more {@lin ...
- Angular jasmine单元测试框架里spyOn的创建原理
准备针对handler的handleError方法创建spy: 保存原始方法的信息到变量originalMetho里: 利用spyFactory.createSpy创建spied版本的新方法: wra ...
- Angular单元测试框架karma-jasmine里类似ABAP unit框架的setup和class_setup方法
类似ABAP unit框架的setup和class_setup方法: 使用TestBed的工厂方法创建Component: 最后使用工厂方法新建Component实例: 创建好的Component实例 ...
- Angular单元测试框架beforeEach和it的执行顺序
AsyncTestZoneSpec: 然后执行第一个it: 再执行beforeEach的callback: 然后执行第二个it: 由此可见,beforeEach相当于ABAP单元测试的setup方法. ...
- ArcGIS教程:克里金法的工作原理(二)
根据经验半变异函数拟合模型 下一步是根据组成经验半变异函数的点拟合模型.半变异函数建模是空间描述和空间预测之间的关键步骤.克里金法的主要应用是预测未采样位置处的属性值.经验半变异函数可提供有关数据集的 ...
最新文章
- 阐述一下Mysql事务的四个特性_数据库事务的四个基本性质?
- ocp 工资_【中秋节加班费】2016中秋节加班工资怎么算,中秋节放假加班费的计算方法...
- C++ Openssl AES GCM 128bits代码示例,可wins10的visual studio 2017 中直接运行
- MethodBase.GetCurrentMethod 方法
- SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有问题?
- python调用其他程序或脚本方法(转)
- 安装mysql5 1步骤_Linux系统安装MySQL详细步骤(mysql-5.1等)
- 电商行业最复杂的人货场分析,我用一个案例给你讲清楚
- 74HC AHCT LS LV ABT区别
- android studio的 gradle 依赖同步错误解决方法
- JdbcTemplate实验
- SPI总线接口与简单配置
- 回答cad转pdf格式的简易方法
- 瑞萨单片机-PWM输出
- 同行:成长路上的三人行
- Linux发行版之间有什么区别?
- 爷青回!最近很火的朋友圈怀旧小电视源码来啦!看到最后一个视频我大呼好家伙!
- 完美实现Ubuntu系统迁移到另一台电脑/服务器
- JAVA基础核心技术总结(2)--基本语法
- 成就你一生的100个哲理51-60
热门文章
- 为甚么 国企做互联网总做不起来?
- fckeditor编辑器自定义加按钮菜单
- win2003主/辅DNS服务器详细配置
- rabbitmq(四)、消息丢失问题
- linux安装redis集群+常见报错
- 团队作业6——展示博客(Alpha版本)
- spring-mvc里的 mvc:resources 及静态资源访问
- asp.net验证码图片生成示例
- java.util -- List接口
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...