为了账号安全,请及时绑定邮箱和手机立即绑定

如何将不同的错误接口实现存储在一起,然后在 Go 中使用它们进行类型比较?

如何将不同的错误接口实现存储在一起,然后在 Go 中使用它们进行类型比较?

Go
倚天杖 2023-07-31 15:53:11
我正在尝试在 go 中编写一个表测试,其中测试用例将导致不同的错误。然后我想检查错误的类型是否与测试用例中定义的错误类型匹配,使用errors.As(). 每个测试用例都由一个结构体定义,因此结构体中需要有一个类型可以保存接口的任何实现error,这也是为了验证测试中返回的类型是否正确。我尝试如下定义结构type testCase struct {        testInput string        expectedError error}我还有许多实现该error接口的自定义错误,假设其中一个称为myCustomError然后我声明该结构的变量,如下所示:mTest := testCase{        testInput: "some failing string",        expectedError: myCustomError{},}如果我然后像这样进行测试......err := someFunc(mTest.testInput)if errors.As(err, &mTest.expectedError) {        // test have succeeded}... if 语句将始终返回true,无论返回哪种自定义错误类型。如果 Go Playground 上存在这种行为,我在这里做了一个最小的示例:https://play.golang.org/p/uMdbMvfcdQi在游乐场示例中,我希望字符串“matching myError1”打印两次,但当该值在用于检查变量 err 的类型之前以myError2普通形式存储时,它也会匹配。 是否有可能做这样的事情?error
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

在测试用例中存储指向目标值的指针。


type testCase struct {

    testInput string

    expectedError interface{}

}


mTest := testCase{

    testInput: "some failing string",

    expectedError: &myCustomError{},

}


err := someFunc(mTest.testInput)

if errors.As(err, mTest.expectedError) {

    // test have succeeded

}

最小示例: https: //play.golang.org/p/igJy9L_ui73


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信