go - 如何在保持测试可比性的同时使用动态错误?
问题描述
在go中我经常使用
func MyFunc(s someInterface) error {
err := OtherFunc(s)
return fmt.Errorf("something wrong: %s", err)
}
所以我失去了原来的错误值,因为我只是把错误字符串伪造成一个新的错误。这就是我所说的动态错误。
现在考虑一个测试MyFunc()
:
func TestMyFunc(t *testing.T) {
s := mockSomeInterface()
testErr := MyFunc(s)
if testErr != interfaceSpecificErrorValue {
t.Errorf("fail")
}
}
我将用于什么interfaceSpecificErrorValue
(在这个例子中是特定的someInterface
)?或者我怎样才能使它可测试?
我知道我可以通过预先定义所有可能的错误并给它们一个恒定值来解决这个问题。我感兴趣的是是否有另一种方法可以实现这一点,因为我喜欢可以使用fmt.Errorf("...: %s, err)
. 必须有一种很好的方法来保持错误层次结构而不丢失原始值。
(比较Error()
方法的输出是一种可能,但不是一个好方法。)
解决方案
我对此的初步回答是:在 Go 中,目前没有规范的方法来实现具有可比错误值的嵌套错误。
再次阅读有关错误处理的官方文档和博客文章,相当多的标准库源代码,最后是这个建议:https ://github.com/golang/proposal/blob/master/design/go2draft-error-values- overview.md,我决定让我的错误类型保持简单和静态,并等待 Go 2 提供更好的方法。
推荐阅读
- reactjs - 如何在 ReactJS 中显示 Firebase 存储下载 URL
- javascript - 为什么在循环排序数组时需要重置计数器变量?
- elasticsearch - 编写查询以获得 Top 10 和 Exclude & Include
- c# - 如何在 URL 中嵌入访问令牌并对其进行验证 - Asp.Net MVC
- javascript - 比较数字总是返回 false
- reactjs - 如何在 Promise 响应中使用 IF 语句来呈现 React 组件
- performance - 高效地从 matlab 编写 CSV 文件
- unit-testing - 定制项目模块的odoo单元测试
- perl - 假装一个自动加载的函数有一个块原型
- google-cloud-platform - GCP 浏览器 ssh 一周左右后停止工作