使用错误变量作为包级与全局变量

使用Go语言,我正在编写一个使用自定义错误变量的函数,例如


func readEnv() (map[string]string, error) {

    var ErrConfig = errors.New("Configuration Error: Variables starting with the right prefix are not even")


if this {

  return nil, ErrConfig

}

我将其声明为本地 var,以避免将其声明为不建议的包级 var(如果我没有记错,请从 linter 中标记为问题)


当我想对这个fxn进行单元测试并且还想测试错误路径时,问题就出现了(在这种情况下,fxn应该返回上述错误,但是无法访问该错误)。现在,我能想到解决这个问题的唯一方法是在我的表测试中重新声明这个变量。


哪种方法是正确的?声明为包级变量还是只是在单元测试 fxn 中重新声明它?ErrConfig


守候你守候我
浏览 97回答 1
1回答

哈士奇WWW

您返回的错误对调用方是否重要?readEnv()如果没关系,你的测试也不应该在乎,只要检查返回的错误是否。nil如果这很重要,在你当前的解决方案中,调用方在测试中的表现不能比你好。如果它很重要并且客户端应该能够分辨,则必须导出某种机制来测试/检查返回的错误。一种解决方案是移动到包级别变量。这是可以接受的,在标准库中也使用了很多地方,例如io。断续器,约。错误关闭的管道。ErrConfig不过,这并不是唯一的解决方案。您可以进行未导出(例如),并提供导出的函数来测试错误,例如:ErrconfigerrConfigvar errConfig = errors.New("Configuration Error: Variables starting...")func IsErrConfig(err error ) bool {    return err == errConfig}这也用于标准库的许多地方,例如os。IsExist(), os.不存在()您还可以使返回的错误实现导出的接口,并且调用方可以使用类型断言来检查返回的错误是否实现了该操作,从而为返回的错误提供了额外的功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go