[UT] Angular 召喚 Karma + Jasmine 來做個單元測試吧 III

Huge Gun
5 min readApr 26, 2020

--

這是 Unit test 系列的第四篇,算是補充篇,依舊是以 Angular 為主,這篇會說一些比較少用的情境,若你還沒看過前三篇的話,可以看這[第一篇] [第二篇] [第三篇],接下來要說的情境有3個:

  1. Component 帶有巢狀 HTML
  2. Custom element
  3. Component 帶有動態 value

開始前你可以先 clone code [Github],那我們就開始吧。

Component 帶有巢狀 HTML

Case: 巢狀 HTML; 路徑: cases/component/nested

File name: nested.component.html

一般比較少會去測試 HTML 的 render,但當你真的想測的時候,就可以參考一下的做法,先建立一個 div 然後他的 child 有一個 p,如下:

File name: nested.component.ts

接著我們在 component 中放入一個變數 nested 和第一個 <P> binding 以便後續做 render test

File name: nested.component.spec.ts

Step-1. 跟之前說的一樣,在 beforeEach 每次跑測試之前,執行一次初始化 component。

Step-2. 一如既往的先測 component 能否被初始化。

Step-3. 從被實例化的 component,呼叫 nativeElement 去拿對應的 child 並確認值是否正確,非常的簡單,多層也是如此。

Custom element

當我們想測試的 element 是自定義的,像是拆成 web component 後,非 html 原生的 element,將它們掛入測試時, Angular 會不留情的噴錯給你,因為它不認得這些東西,我們來看看怎麼做測試

Case: Custom element; 路徑: cases/component/custom-element

File name: custom-element.component.html

上例以掛入先前自定義的 app-counter 計數器 component 來做演示

File name: custom-element.component.spec.ts

在這個 spec 檔中,會有兩種 type 的處理方法,要達到的目的都是一樣的,它們說明如下:

  1. First type: NO_ERRORS_SCHEMA,這是官方提供的工具,可以讓 Angular 照單全收所有掛入的 element 不報錯,詳細可看[這邊],要使用只要在 TestBed 初始化時在 schemas 掛入即可。
  2. Second type: Component Decorator,等於 import 自定義的 component 進來做初始化,要這樣用記得在 TestBed 同時掛入要用到的全部元件。

至於以上兩種方式就看自己取捨,我個人是偏好第一種較簡潔。

Step-1. 跟前述都一樣,在 beforeEach 每次跑測試之前,執行一次初始化 component。

Step-2. 一如既往的先測 component 能否被初始化。

Step-3. 和巢狀情境一樣,使用實例化出來的component nativeElement 去取得測是 child,並判斷值是否正確即可。

Component 帶有動態 value

有時候 component 會用到 random or 取當下時間等等…value 是動態產生的,若依照前幾篇的做法會失敗,因為之前都是以固定的值去預期測試結果,這邊會以有 random value 的例子演示一下怎麼做動態值的 UT

Case: Dynamic value; 路徑: cases/component/dynamic-value

File name: dynamic-value.component.ts

我們有個簡單的 function,它會隨機產生數字跟丟它的最大值 & 最小值去計算,接著看測試怎麼寫

File name: dynamic-value.component.spec.ts

Step-1. 跟前述都一樣,在 beforeEach 每次跑測試之前,執行一次初始化 component。

Step-2. 一如既往的先測 component 能否被初始化。

Step-3. 使用 spyOn 模擬從被實例化 component 的 randomNumber function,並將它的 returnValue 塞入固定的 12345,這樣我們就能確保後續的測試值 。

Step-4. 有了 Step-3 的固定,就能測試這個動態值了,請注意這邊是已經知道 dynamic value 的格式,所以才能測試,若連格式都不知道是不能受測的。

--

--

Huge Gun

槍再大把,沒子彈是不行的;通過學習,鍛造自己的子彈!https://github.com/HsienW