让我们为简单起见,我有一个简单的函数,该函数只是尝试基于作为参数传递的字符串打开文件(不要依赖文件打开过程的简单性,因为实际示例会更复杂一些) )
func retrieveConfig(fs billy.Filesystem, app string) (Spec, error) {
var v Spec
filename := "releases/" + app + ".yaml"
file, err := fs.Open(filename)
if err != nil {
errOpenFile := ErrOpeningConfigFile{filename}
return Spec{}, new errOpenFile{filename}
}
这是我正在使用的自定义错误的定义
type ErrOpeningConfigFile struct {
s string
}
func (errConfigFileNotFound *ErrOpeningConfigFile) Error() string {
return fmt.Sprintf("Error opening configuration file %s")
}
我之所以考虑采用这种方法,是因为我的想法是它将提供更多的覆盖范围,并使核心更具可测试性。
由于我可以在单元测试中针对自定义错误键入assert,因此现在我可以更轻松地测试错误路径。
但是,这肯定会增加代码库。
我认为相反的方法是
return nil, errors.New("Configuration file not found")
这将限制代码,但会使测试变得笨拙(或更窄范围)。
解决此问题的适当方法(或惯用的方式)是什么?