我遇到了如下问题:编写单元测试时比较 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)
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
reflect: true
compare: false
errorIs: false
Run Code Online (Sandbox Code Playgroud)
我想比较 2 个错误,这reflect.DeepEqual(er1, er2)是我应用的第一种方法,此方法产生我想要的输出,但此方法有一个警告go lint:
avoid using reflect.DeepEqual with errorsdeepequalerrors
Run Code Online (Sandbox Code Playgroud)
经过谷歌搜索,有人告诉我一些方法:
cmp.Equal(er1, er2, cmpopts.EquateErrors())errors.Is(er1, er2)但是上述两种方法都不能产生与第一种方法相同的结果(使用reflect.DeepEqual)。我如何在没有警告的情况下比较两个错误并产生像
Tksgo lint这样的结果reflect.DeepEqual
根据您编写测试的方式,您可能会依赖reflect.DeepEqual()并忽略 linter 警告;
缺点是:您开始依赖于您返回的错误的内部结构。
在我们编写的测试代码中,我们使用以下模式之一:
nil;package pkg
var ErrUnboltedGizmo = errors.New("gizmo is unbolted")
// in test functions, depending on the case :
if err == pkg.ErrUnboltedGizmo { ...
// or :
if errors.Is(err, pkg.ErrUnboltedGizmo) { ...
Run Code Online (Sandbox Code Playgroud)
io.EOF),我们编写代码来尽职地包装该已知错误,并使用errors.Is()(在生产代码和测试代码中),Parse error和 not File not found)时,我们只需在错误消息中搜索字符串:if err == nil || !strings.Contains(err.Error(), "database name is not exists") {
t.Errorf("unexpected error : %s", err)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4793 次 |
| 最近记录: |