測試包含log.Fatal() 的Go 函數
考慮一個場景,其中您有一個使用log.Fatal() 進行列印的Go 函數訊息。測試此類函數可能具有挑戰性,因為 log.Fatal() 會觸發 os.Exit(1),從而導致測試失敗。
方法:
要克服這個挑戰,需要建議實作一個自訂記錄器,將輸出重新導向到其標準 log.xxx() 目的地。但是,在測試期間,您可以輕鬆地將 log.Fatalf() 等函數與您自己的不呼叫 os.Exit(1) 的實作進行交換。
範例:
假設我們有以下列印日誌的程式碼:
package main import ( "log" ) func hello() { log.Print("Hello!") } func goodbye() { log.Fatal("Goodbye!") } func init() { log.SetFlags(0) } func main() { hello() goodbye() }
為了測試這段程式碼,我們可以製定假設測試:
package main import ( "bytes" "log" "testing" ) func TestHello(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) hello() wantMsg := "Hello!\n" msg := buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } } func TestGoodby(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) goodbye() wantMsg := "Goodbye!\n" msg := buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
注意:
此方法提供了在測試期間替換特定記錄器函數的靈活性,允許在不影響原始函數功能的情況下進行行為自訂正在測試。
以上是如何使用 log.Fatal() 有效測試 Go 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!