当前位置:网站首页>Jest 测试框架 beforeEach 的设计原理解析
Jest 测试框架 beforeEach 的设计原理解析
2022-08-02 11:11:00 【华为云】
副标题:SAP Spartacus SSR 优化的单元测试分析之一 : beforeEach
SAP Spartacus 里这段代码:

originalEngine = jasmine .createSpy('ngExpressEngine') .and.callFake(() => originalEngineInstance);该方法接受一个字符串作为创建的 Spy 的名称,返回一个新的 Spy 对象。

这个新创建的 spy 对象,还是位于 jasmine namespace 之下。

spy.and: 返回 SpyStrategy 实例:

接下来,我们就可以通过这个 spy 对象的 strategy 方法,指派这个 spy 去做一些事情了。
callFake:callFake(fn)
Tell the spy to call a fake implementation when invoked.
单步调试 createSpy 方法:
转交给 env:
在 jasmine 内部,新建 strategy dispatcher 和 callTracker:

wrapper 的 and 属性,来自 strategy dispatcher 的 and 属性:
createSpy 最后返回的是 wrapper:
wrapper.and 指向 strategy:
调用 strategy 的 callFake 方法:
其实就是把通过 callFake 传入的函数,赋给 Strategy 对象的 plan 字段:
callFake 是一个链式调用,返回 wrapper 即 span 本身:
同理,创建另一个 id 为 ngExpressEngineInstance 的 wrapper spy,将一个空的函数赋给 strategy 对象的 plan 属性:

进入 decorator 的 get 方法,也就是我们要测试的方法:
此处 45行传入的 originalEngine 为 spy.

执行这个 mock 方法:
并且以下列这些输入参数执行 spy:
当 spy 被执行时,其执行的上下文会自动被 jasmine 框架所记录,这是通过 callTracker 完成的。
returnValue,则是通过 strategyDispatcher 所指定。

如果我们的单元测试代码里,使用 and 指定了这个 spy 被调用之后,应该返回什么样的值,则这些指定值,在上图第 7687 行代码被返回。

在我们待测试的 get 方法里,最终会执行 originalEngine.
而这个 engine 已经被 spy 过了,所以执行 spy 后的版本。

mock 之后的 originalEngine,被调用时,会返回其 callFake 方法指定的函数的返回值,即 originalEngineInstance.

其原因如下,因为 spyStrategy 的 exec 方法,执行的函数就是之前用 callFake 调用,绑定到 plan 属性指向的函数:originalEngine = strategy.callFake(() => originalEngineInstance);

这个 originalEngineInstance 也是一个 spy:
返回的 originalEngineInstance:

只要使用 spy 过的函数进行调用,则调用时传入的参数和返回值必定会被 jasmine 记录在案:
使用 mock 过的 spy 调用,记录这三个输入参数:
边栏推荐
- 细学常用类,集合类,IO流
- How to technically ensure the quality of LED display?
- LeetCode笔记:Weekly Contest 304
- 智能手表前景如何?
- [Science of Terminology] For those difficult words about the integrated workbench, read this article to understand in seconds!
- 外包学生管理系统架构文档
- 软件测试岗位巨坑?阿里在职7年测试人告诉你千万别上当
- C#为listview选中的项添加右键菜单
- STM32+MPU6050设计便携式Mini桌面时钟(自动调整时间显示方向)
- Hub and Spoke配置案例
猜你喜欢

10份重磅报告 — 展望中国数字经济未来

字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....

jacoco的学习以及理解

注意力机制

bgp与mpls综合实验

Outsourced Student Management System Architecture Documentation

同样做软件测试,和月收入 3W 的学弟聊了一晚上,我彻底崩溃了

C#/VB.NET to add more lines more columns image watermark into the Word document

Getting Started with Three.JS Programmatic Modeling

Failed to configure mysql, what's going on?
随机推荐
LayaBox---TypeScript---Three slash instructions
Hongxing, donate another million
小程序插件的生态丰富,加速开发建设效率
LayaBox---TypeScript---Decorator
微信小程序---组件开发与使用
阿里云数据存储生态计划发布,助力伙伴数据创新
从众多接口中脱颖而出的最稳定的接口——淘宝详情api
LayaBox---TypeScript---Mixins
只问耕耘,不问收获,其实收获却在耕耘中
21 Days Learning Challenge - Day 1 Punch (Screen Density)
FinClip | 来了, 2022 年 7 月更新大盘点
npm run dev 和 npm run serve区别
ansible module --yum module
sva 断言资料
腾讯云云函数SCF—入门须知
Multithreading (Basic) - 40,000 word summary
同样做软件测试,和月收入 3W 的学弟聊了一晚上,我彻底崩溃了
List排序 ,取最大值最小值
STM32+MPU6050设计便携式Mini桌面时钟(自动调整时间显示方向)
C#/VB.NET 添加多行多列图片水印到Word文档