关于jest:Jest-测试框架-beforeEach-的设计原理解析

2次阅读

共计 1333 个字符,预计需要花费 4 分钟才能阅读完成。

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

正文完
 0