依賴注入與自動測試


Posted by JingTeng on 2021-07-08

以前...

只知道用靜態方法(官方文件也都用靜態方法)

TestService::getTest()
  • 必須宣告靜態方法
  • 如果宣告為靜態方法,那一開始就全部放進記憶體,但這個東西不見得會用到
  • 把到處都會用到的東西才要放進記憶體(設成靜態)
  • 其實還有狀態問題 靜態methods/properties 都不適合做有狀態應用

依賴注入(DI)

另一個選擇:依賴注入

在講 DI 之前,要先知道怎麼不 DI(就是 new 啦)

new TestService()->getTest()
  • 缺點 要抽掉 TestService 就要修改
  • 如果是測試想隔離抽換,就要用 DI

依賴注入如何解決這個問題:

// 簡寫筆記
private $testService;

__construct(TestService $testService)
{
    $this->testService = $testService; 
    // 依賴注入 建構子的注入
    // Laravel 會在建立這個 controller 時幫你實例一個 TestServiece 參數放進去
}

這樣就是創建 controller 才會實例化這個 class,不會放一堆東西進記憶體。

還有什麼時候會用到依賴注入=>自動測試

原因:Service 應該要可以被隔離
因為可能在做單元測試,想控制變因。想隔離的服務可能是:接金流、讀 DB。

靜態方法在測試可以用 alias 解決,但 DI 比較好

mock

mock 會幫你用做一個假的 class。
測試時期宣告這段,就會創一個假 class 先把你後面的換掉,甚至在測試階段這個 getTest function 可以壞掉,還是會通過測試。

this->mock 那一段 的意思,(在這一段測試程式裡面)之後遇到 TestService 都要換成 mockery 的 TestService


#後端同樂會







Related Posts

[筆記] C++ 01 - 初學者學習

[筆記] C++ 01 - 初學者學習

人人都會的 Android Apk 反編譯

人人都會的 Android Apk 反編譯

23. Template Method

23. Template Method


Comments