我遇到了一个问题,如下所示:比较编写单元测试时的2个错误
package main
import (
"errors"
"fmt"
"reflect"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)
func main() {
er1 := errors.New("database name is not exists")
er2 := errors.New("database name is not exists")
result1 := reflect.DeepEqual(er1, er2)
fmt.Println("reflect: ", result1)
result2 := cmp.Equal(er1, er2, cmpopts.EquateErrors())
fmt.Println("compare: ", result2)
result3 := errors.Is(er1, er2)
fmt.Println("errorIs: ", result3)
}
字符串
上面代码的输出是:
reflect: true
compare: false
errorIs: false
型
我想比较2个错误,reflect.DeepEqual(er1, er2)
是我应用的第一种方法,这个方法产生了我想要的输出,但是这个方法有一个来自go lint
的警告:
avoid using reflect.DeepEqual with errorsdeepequalerrors
型
在谷歌搜索之后,有些人告诉我一些方法:
- 使用cmp包进行比较:
cmp.Equal(er1, er2, cmpopts.EquateErrors())
个 - 使用错误包进行比较:
errors.Is(er1, er2)
但是,上述两种方法都不能产生与第一种方法(使用reflect.DeepEqual)相同的结果。我如何在没有来自go lint
的警告的情况下比较2个错误,并产生像reflect.DeepEqual
Tks一样的结果
2条答案
按热度按时间8yoxcaq71#
根据您编写测试的方式,您可能依赖于
reflect.DeepEqual()
并忽略linter警告;缺点是:你开始依赖于你返回的错误的内部结构。
在我们编写的测试代码中,我们使用以下模式之一:
nil
进行比较;字符串
io.EOF
),我们编写代码来忠实地 * Package * 已知的错误,并且我们使用errors.Is()
(在产品代码和测试代码中),Parse error
而不是File not found
),我们只需在错误消息中搜索字符串:型
dsf9zpds2#
我发现有用的是使用cmppopts.IgnoreFields的cmp.diff来忽略特定的错误字段,这些错误字段会导致你详细的问题,然后我只需使用string.Contains或任何我发现合适的错误来检查错误。
它是这样的:
字符串
现在只检查它们自己的错误,就是这样。
是的,我知道你已经标记了一个解决方案,但也许它会帮助别人:)