副标题: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 调用,记录这三个输入参数:

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

Jest 测试框架 beforeEach 的设计原理解析相关推荐

  1. Jest测试框架学习(一)

    前言 jest是针对JavaScript的测试框架.如果遵循TDD原则,在任何功能开发之前都需要先写测试.而测试分为单元测试,集成测试和系统测试. 单元测试 单元测试可以理解为对于单个函数(单一功能) ...

  2. Jest 测试框架 expect 和 匹配器 matcher 的设计原理解析

    副标题:SAP Spartacus SSR 优化的单元测试分析之二 - 调用参数检测 源代码: it(`should pass parameters to the original engine in ...

  3. 网狐棋牌框架内核通信设计原理剖析

            关于网狐框架我使用和了解大致有5年多了,也深知里面的一些坑坑洼洼,其他人写的一些关于网狐框架分析的文章,大多都是贴上大量的代码,模块流程大致的解说,都是一些皮毛解说,并没有点出为什么这 ...

  4. Spring框架(一) 底层核心原理解析

    感兴趣的话大家可以关注一下公众号 : 猿人刘先生 , 欢迎大家一起学习 , 一起进步 , 一起来交流吧! 说明 本系列文章以spring-framework-5.3.10为例 , 本篇文章的目的就是使 ...

  5. 阿里分布式事务框架Seata,AT模式原理解析

    什么是分布式事务 如今在分布式技术盛行下,许多公司都已经在使用分布式技术了,虽然分布式技术给我们项目带来了三高(高可用,高扩展,高性能)等优点,但是缺点也很明显,分布式项目一般都是分服务开发,且多个服 ...

  6. NFS文件锁一致性设计原理解析

    简介:在存储系统中, NFS(Network File System,即网络文件系统)是一个重要的概念,已成为兼容POSIX语义的分布式文件系统的基础.它允许在多个主机之间共享公共文件系统,并提供数据 ...

  7. Jest 测试框架使用的学习笔记

    Jest Tutorial for Beginners: Getting Started With JavaScript Testing Jest 是一个 JavaScript 测试运行器,即用于创建 ...

  8. disruptor 框架使用以及ringbuffer原理解析

    Disruptor 概述 子主题 1 从功能上来看,Disruptor 是实现了"队列"的功能,而且是一个有界队列.那么它的应用场景自然就是"生产者-消费者"模 ...

  9. Jest 测试框架配置 jest-stare

    简述安装步骤: 默认你已经配置好jest了, 如果没有可以看我往期的笔记 安装 jest-stare 依赖 npm install jest-stare --dev 配置 package.json 文 ...

最新文章

  1. Spring cloud集成Rabbitmq
  2. 1 Hadoop简介
  3. jquery 替换括号里面内容_【推荐】前端框架 Bootstrap 5.0 alpha 发布,不再依赖 jQuery...
  4. UVA260 Il Gioco dell‘X【DFS】
  5. Linux 异步IO
  6. 深鸿会深大小组学习笔记:第二周,从零开发鸿蒙小游戏2048app(下)
  7. lenovo G50-80bios设置U盘启动选项及win10永久激活及win10下载
  8. sumifs多条件求和步骤,sumifs函数运用
  9. 奥城大学计算机专业,美国研究生双录取大学有哪些?
  10. Excel翻译单元格内容
  11. php sapi全拼,php sapi
  12. Android第三方视频加载框架JCVideoPlayer
  13. “展厅三维全景”技术,将产品和企业文化以vr展示出来
  14. JS原型和原型链是什么?
  15. Spark学习-DAY4
  16. 无公网服务器(ip)做内网穿透
  17. 洛谷 P1564 膜拜 C++ dp
  18. 项目管理:硬件类项目完整开发流程
  19. 511遇见易语言模块API教程进程结束和进程取自进程ID
  20. 【C# 教程系列第 22 篇】c# 批量修改文件名

热门文章

  1. kubernetes in action - Replication Controller
  2. 性能测试-Gatling(一)
  3. 被忽视的ArrayList,你知道多少
  4. 406(浏览器接收的响应类型和服务器返回的响应类型不匹配)
  5. CPU亲缘性及网卡中断绑定
  6. Git - 版本控制工具十分钟入门手册
  7. 2.5 隐藏委托关系
  8. 【SSH网上商城项目实战05】完成数据库的级联查询和分页
  9. UrlRewrite(URL重写)--ASP.NET中的实现
  10. html5 canvas(小树姐的牛掰到爆了的作品)