Jest 测试框架 beforeEach 的设计原理解析
副標題: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 的设计原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广东省-IT公司红黑榜排名
- 下一篇: Jest 测试框架 expect 和 匹