首页 > 解决方案 > 如何在保持测试可比性的同时使用动态错误?

问题描述

在go中我经常使用

func MyFunc(s someInterface) error {
    err := OtherFunc(s)
    return fmt.Errorf("something wrong: %s", err)
}

所以我失去了原来的错误值,因为我只是把错误字符串伪造成一个新的错误。这就是我所说的动态错误。

现在考虑一个测试MyFunc()

func TestMyFunc(t *testing.T) {
    s := mockSomeInterface()
    testErr := MyFunc(s)
    if testErr != interfaceSpecificErrorValue {
        t.Errorf("fail")
    }
}

我将用于什么interfaceSpecificErrorValue(在这个例子中是特定的someInterface)?或者我怎样才能使它可测试?

我知道我可以通过预先定义所有可能的错误并给它们一个恒定值来解决这个问题。我感兴趣的是是否有另一种方法可以实现这一点,因为我喜欢可以使用fmt.Errorf("...: %s, err). 必须有一种很好的方法来保持错误层次结构而不丢失原始值。

(比较Error()方法的输出是一种可能,但不是一个好方法。)

标签: gotestingerror-handling

解决方案


我对此的初步回答是:在 Go 中,目前没有规范的方法来实现具有可比错误值的嵌套错误。

再次阅读有关错误处理的官方文档和博客文章,相当多的标准库源代码,最后是这个建议:https ://github.com/golang/proposal/blob/master/design/go2draft-error-values- overview.md,我决定让我的错误类型保持简单和静态,并等待 Go 2 提供更好的方法。


推荐阅读