我正在使用err113
作为golangci-lint
的一部分。
它正在抱怨...
foo_test.go:55:61: err113: do not define dynamic errors, use wrapped static errors instead: "errors.New("repo gave err")" (goerr113)
repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, errors.New("repo gave err")),
^
foo_test.go:22:42: err113: do not define dynamic errors, use wrapped static errors instead: "errors.New("oops")" (goerr113)
repoMock.EXPECT().FindAll().Return(nil, errors.New("oops"))
^
解决此问题的最佳方法是什么?
引用 https://github.com/Djarvur/go-err113
此外,任何错误调用。New(( 和 fmt。报告错误 (( 方法 除了用于初始化包级变量的调用和 FMT.Errorf(( 调用包装其他错误。
我正在尝试为此获得一个惯用的例子。
按照建议声明包级变量:
var repoGaveErr = errors.New("repo gave err")
func someFunc() {
repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, repoGaveErr)
}
每次调用错误。"新建"分配一个新的唯一错误值。应用程序通过声明包级变量来创建表示错误的单个值。
单个值有两个动机:
应用程序可以比较相等值以检查特定的错误条件。
减少内存分配(尽管在实践中可能不是什么大问题(
值 io。EOF是一个典型的例子。
从GO 1.13开始,您可以定义一个新的错误类型,包装它并使用它。 例如,如果要返回"不允许的操作"+操作。 你需要实现类似的东西
var OperationNotPermit = errors.New("operation not permitted")
func OperationNotFoundError(op string) error {
return fmt.Errorf("OperationNotPermit %w : %s", OperationNotPermit, op)
}
然后在您的代码中,当您想要返回错误时,
return nil, OperationNotFoundError(Op)
让我们回到问题案例:
首先,定义自定义错误和 wapper
var repoError = errors.New("repositoryError")
func RepositoryError(msg string) error {
return fmt.Errorf("%w: %s", repoError,msg)
}
然后在您的代码中,
repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, RepositoryError("YOUR CUSTOM ERROR MESSAGE"))
由于之前没有说过,您可能不需要为测试定义包级错误。鉴于这个想法是包装错误,以便可以在调用者中比较和解包它们,只要满足测试的目的,在测试中返回动态错误就可以了。