英文:
Ginkgo/Gomega Panic Test Fails
问题
我正在写一个测试来断言一个函数在无效输入时会发生 panic,但是 Ginkgo 将 panic 记录为失败,而不是预期的通过结果。
func ParseUnixTimeString(unixTimeString string) time.Time {
i, err := strconv.ParseInt(unixTimeString, 10, 64)
if err != nil {
panic(fmt.Sprintf("could not parse time: %s", err.Error()))
}
return time.Unix(i, 0)
}
func TestFormat(t *testing.T) {
gomega.RegisterFailHandler(ginkgo.Fail)
ginkgo.RunSpecs(t, "Format Suite")
}
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(
tools.ParseUnixTimeString("2314321432143124223432434")).To(gomega.Panic())
})
})
})
返回结果(简化):
•! [PANICKED] [0.002 秒]
[It] should panic if the time can't be formatted
测试发生了 Panic
could not parse time: strconv.ParseInt: parsing "2314321432143124223432434": value out of range
在 0.002 秒内运行了 1 个 Spec
FAIL! -- 0 通过 | 1 失败 | 0 待定 | 0 跳过
如何在 Ginkgo/Gomega 中正确测试 panic?
英文:
I'm writing a test to assert that a function panics on invalid input, but Ginkgo records the panic as a failure instead of a passing result as expected.
func ParseUnixTimeString(unixTimeString string) time.Time {
i, err := strconv.ParseInt(unixTimeString, 10, 64)
if err != nil {
panic(fmt.Sprintf("could not parse time: %s", err.Error()))
}
return time.Unix(i, 0)
}
func TestFormat(t *testing.T) {
gomega.RegisterFailHandler(ginkgo.Fail)
ginkgo.RunSpecs(t, "Format Suite")
}
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(
tools.ParseUnixTimeString("2314321432143124223432434")).To(gomega.Panic())
})
})
Which returns (condensed):
•! [PANICKED] [0.002 seconds]
[It] should panic if the time can't be formatted
Test Panicked
could not parse time: strconv.ParseInt: parsing "2314321432143124223432434": value out of range
Ran 1 of 1 Specs in 0.002 seconds
FAIL! -- 0 Passed | 1 Failed | 0 Pending | 0 Skipped
How do I properly test for panics in Ginkgo/Gomega?
答案1
得分: 6
从文档中可以看到:
> 如果 ACTUAL 是一个函数,在调用时会引发 panic,则成功。ACTUAL 必须是一个不带参数且不返回结果的函数 -- ACTUAL 的任何其他类型都是错误的。
请注意,ACTUAL(传递给 Expect
的参数)应该是一个函数。在这种情况下,Gomega 会调用该函数并捕获 panic,以便可以对其进行断言。
要修复你的特定示例:
var _ = ginkgo.Describe("Format Tests", func() {
ginkgo.Describe("When formatting the date", func() {
ginkgo.It("如果时间无法格式化,应该引发 panic", func() {
gomega.Expect(func(){
tools.ParseUnixTimeString("2314321432143124223432434")
}).To(gomega.Panic())
})
})
英文:
From the documentation:
> succeeds if ACTUAL is a function that, when invoked, panics. ACTUAL must be a function that takes no arguments and returns no result -- any other type for ACTUAL is an error.
Notice that ACTUAL (the argument passed into Expect
) is supposed to be a function.
What Gomega will do in this case, is invoke that function and catch the panic so it can assert on it.
To fix your particular example:
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())
})
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论