Ginkgo/Gomega Panic测试失败 如何正确断言函数触发panic
Ginkgo/Gomega 框架中正确测试函数panic场景的方法
问题原因
当前写法失败的核心原因是:直接将待测函数的调用结果作为参数传入gomega.Expect时,函数会在参数求值阶段就直接触发panic,此时Panic()匹配器还未获得执行权,没有机会通过recover()捕获这个panic,Ginkgo直接捕获到未处理的panic就会判定测试失败。
正确写法
你需要将待测的会触发panic的逻辑,包裹在一个无参数的匿名函数中,再将这个匿名函数传给Expect,让Panic()匹配器可以接管函数执行流程、捕获内部panic完成断言。
修正后的测试用例代码如下:
var _ = ginkgo.Describe("Format Tests", func() { ginkgo.Describe("When formatting the date", func() { ginkgo.It("should panic if the time can't be formatted", func() { // 注意这里要包裹成无参匿名函数传入 gomega.Expect(func() { tools.ParseUnixTimeString("2314321432143124223432434") }).To(gomega.Panic()) }) }) })
扩展用法
如果你不仅需要断言函数发生panic,还需要校验panic抛出的具体内容,可以使用gomega.PanicWith()匹配器,支持传入具体值或者其他Gomega匹配器做校验,例如:
// 断言panic信息包含指定字符串 gomega.Expect(func() { tools.ParseUnixTimeString("2314321432143124223432434") }).To(gomega.PanicWith(gomega.ContainSubstring("could not parse time")))
注意:所有需要断言panic、异常抛出的场景,都要保证待执行逻辑延迟到匹配器内部再执行,不能在传参阶段就提前触发。
内容的提问来源于stack exchange,提问作者frederix
相关产品推荐
相关产品推荐

