在 Go 中測試恐慌
在 Go 中編寫測試時,檢查恐慌可能是一種有用的技術。然而,與 Java 不同,Go 沒有明確的語法來選擇性地處理恐慌。
考慮以下範例:
func f(t *testing.T) { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() OtherFunctionThatPanics() t.Errorf("The code did not panic") }
此程式碼嘗試使用復原函數從 OtherFunctionThatPanics 中的任何恐慌中復原。然而,確定函數是否發生恐慌或是否沒有發生恐慌可能具有挑戰性。
解決方案
建議的方法是專注於測試是否存在恐慌的恐慌。這可以透過反轉邏輯並確保在預期的情況下發生恐慌來實現:
func TestPanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() // Code under test OtherFunctionThatPanics() }
此外,更高級的測試框架(例如Ginkgo 或Gomega)提供內建匹配器來斷言恐慌的發生:
Expect(OtherFunctionThatPanics).To(Panic())
實用函數
對於為了方便起見,您可以建立一個通用函數來斷言恐慌:
func assertPanic(t *testing.T, f func()) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() f() }
此函數可以按函數來斷言恐慌:
func TestPanic(t *testing.T) { assertPanic(t, OtherFunctionThatPanics) }
以上是如何有效測試 Go 中的恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!