在 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中文网其他相关文章!