單元測試 – 依賴注入

使用依賴注入來達成低藕合高內聚的程式碼

1. 針對相依的物件抽出interface,針對相依的值抽出field
2. 產生contructor,選要注入的field去依賴注入
3. 產生無參數的constructor,確保本來的程式無誤
4. 測試程式新增fake物件做interface,決定行為並注入SUT

以下為範例程式
AuthenticationServiceTests.cs

AuthenticationService.cs

使用Substitute來針對不同狀況實作假介面


上面做法有什麼問題?

  • 每一個不同的依賴案例就要製作一個不同的FakeObject,會讓寫測試的時間太久
  • 沒辦法直接從程式碼知道為什麼這樣會是Vaild

使用Subsitute(NSub)

定義假物件行為(stub)

使用mock object assertion

需求:驗證是非法的時候要記一個log

不要用太多mock就算要使用要避免過度指定,也就是當prod code小小變動就導致測試程式壞掉

驗證傳入的參數是否包含某些關鍵字

測試替身

  • stub:不做驗證,單純只做模擬相依物件的行為
  • mock:一開始就要把所有的都定義清楚,應該要呼叫那個方法,所有的值一定要一模一樣,否則就會報錯(嚴格,敏感,不穩定)
  • spy: 則是把所有的互動先做完,只驗要驗的,剩的沒有測就是都算過,差異是一個從嚴一個從寬。(寬鬆)

因此mock和spy本身含有驗證(Assertion),而stub本身只有在模擬相依的物件而已。

重構test

  • 抽出field: mock object, stub
  • Setup: SUT初始化(或者[TestInitialize])
  • 抽出方法(用Given為開頭):定義mock object行為,代表假如在跑這個scenario時…
  • Extra Method with “Shouldxxx()” => SUT行為+Assertion

3A pattern: Arrange, Act, Assert
上面重構後Arrange就用Given…,然後Act就是SUT行為,Assert就是Assertion。

下面為重構後的程式碼:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *