Golang 依賴注入(Dependency Injection)

Dependency Injection 🧪

依賴注入是目前很多優秀框架都在使用的一個設計模式。
Dependency Injection 常常簡稱爲:DI。它是實現控制反轉(Inversion of Control – IoC)的一個模式。

在各種大工程中少不了各種測試,其中 TDD 就是非常流行的一種,在前端開發中用的比較多的 Jest 就是一種,在 Golang 開發命令行工具的時候也是需要 DI 這種模式來實現命令行測試的。因爲傳統的測試室獲取不到命令行的輸入輸出的。

工程意圖

倉庫:https://github.com/guzhongren/TDD/tree/master/10.dependency-injection
編寫一個命令行工具庫,打包並運行程序,根據工具名稱後面的名稱來顯示 'Hello, + 名稱'

簡化程序

我們知道 golang 打包後就是一個可執行程序,程序名稱根據你指定的名稱顯示,那麼要實現這個工具就是需要接收到程序名後面的參數並顯示出來。但本次的重點是實現 DI, 所以我們將重點放在命令行的測試與實現上。
我們只實現 Greet 函數的 DI 就可以了。

初始化工程

go mod init dependency-injection

按照慣例,測試的函數需要以 Test 開頭,參數爲 *testing.T 類型

Test

  • 測試先行
func TestGreet(t *testing.T) {
    // 申明 buffer,準備接受數據, 因爲bytes.Buffer, 重點:bytes.Buffer實現了 io.Writer
    buffer := bytes.Buffer{}
    // 將buffer 傳入,此時就是依賴注入的入口,
    Greet(&buffer, "chris")
    // 獲取程序運行的結果
    got := buffer.String()
    // 期望值
    want := "Hello, chris"
    // 測試判斷
    if got != want {
        t.Errorf(`got %s, want %s`, got, want)
    }
}
  • 運行 go test, 程序會報錯,因爲沒有實現 Greet 函數。
  • 最小化的實現 Repeat
// Greet 打印問候
func Greet(w io.Writer, name string) {
    fmt.Fprintf(w, "Hello, "+name)
}

重點說明,命令行的測試需要將結果打印在命令行窗口中,如果沒有測試,我們可以用 fmt.Printf 等打印函數將結果打印出來,但是,
測試需要拿到打印的內容,就需要將內容用標準輸出;當然可以變相的先用其他打印函數將結果打印出來,然後再將結果 return 出去,
在測試中,接受返回值,再比較;這樣做不標準而已,學了今天內容其實就可以用 DI 來解決了。

運行測試

  • 基本測試
$ go test
PASS
ok      dependency-injection    0.006s

總結

基本測試很簡單,不用解讀了。作爲開發者,我們應該用最直接的工具來保證我們程序的健壯性,而不一定要繞個彎來解決問題,如上面的打印結果的測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章