在 Go 中编写单元测试时,通常需要验证特定代码路径是否触发 Panic。虽然 Go 提供了一种名为“recover”的机制来处理恐慌,但它不提供直接支持来指定如何在发生恐慌时跳过或执行代码。
为了克服这个限制,我们可以利用微妙之处测试并不能定义成功的概念,而只能定义失败的概念。利用这一点,我们可以按如下方式构建我们的测试:
func TestPanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() // The following is the code under test OtherFunctionThatPanics() }
在此示例中,如果 OtherFunctionThatPanics 不恐慌,则恢复函数将返回 nil,并且测试将因调用而失败到 t.Errorf。如果发生恐慌,recover 将捕获它,测试将通过。
或者,我们可以创建一个辅助函数来抽象出恐慌检查逻辑:
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 中的恐慌测试。
以上是如何在 Go 单元测试中有效测试恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!