gpt4 book ai didi

go - 测试从 panic 中恢复

转载 作者:IT王子 更新时间:2023-10-29 01:33:31 26 4
gpt4 key购买 nike

我想测试一个构造函数,但如果没有提供某些数据,我需要 panic ,我该如何从测试中的 panic 中恢复过来?

目前我已经在我的 TestNew 函数中添加了一个带有恢复的延迟,但是如果我的 map 中的一个元素有一个空的 URL,其余的将不会被检查。

走吧

package testing

type test {
url string
}

func New(ops map[string]string) *test {
if ops["url"] == "" {
panic("Url missing")
}
var t = new(test)
t.url = ops["url"]
return t
}

t_test.go

package testing

type testTest map[string]string
var testingTest = []testTest {
testTest {
"url": "test",
},
testTest{
"url": "",
},
}

func NewTest(t *testing.T) {
defer func() {
recover()
}()

for _, e := range testingTest {
url := New(e)
url.hasUrl(t, e["url"])
}
}

func (s *test) hasUrl(t *testing.T, u string) {
if s.url != u {
t.Errorf("Expected %s to be equal with %s", s.url, u)
}
}

最佳答案

我会说为依赖 panic/recover 的库设计 API 不是正确的方法。 Go 有错误模式,所以如果方法 New 无法测试,它可以返回状态。

package testing

type test {
url string
}

func New(ops map[string]string) (*test, bool) {
if ops["url"] == "" {
return nil, false
}
var t = new(test)
t.url = ops["url"]
return t, true
}

然后

for _, e := range testingTest {
url, ok := New(e)
if ok {
url.hasUrl(t, e["url"])
}
}

如果您坚持使用panic,那么您可以将调用包装到函数中并在其中恢复。但是您仍然需要向调用者提供状态。

package main

import "fmt"

func test(e int) {
if e == 2 {
panic("panic!")
}
}

func main() {
for _, e := range []int{1, 2, 3} {
func() {
defer func() { recover() }()
test(e)
fmt.Println("testing", e)
}()
}
}

关于go - 测试从 panic 中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31706145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com