为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理 go 测试用例中的 json 语法错误?

如何处理 go 测试用例中的 json 语法错误?

Go
素胚勾勒不出你 2022-11-28 14:35:23
json.Unmarshall我正在测试失败并返回的场景&json.SyntaxError{msg:"unexpected end of JSON input", Offset:0}代码是这样的:err = json.Unmarshal(input, &data)if err != nil {    return nil, err}测试用例预计会出现这种类型的错误:{...errorType: &json.SyntaxError{},...}断言是这样的:assert.Equal(t, tt.errorType, err)这是失败的,因为错误消息不同:expected: &json.SyntaxError{msg:"", Offset:0}actual  : &json.SyntaxError{msg:"unexpected end of JSON input", Offset:0}我该如何处理?也许利用Error()?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

首先,不可能直接制作这个哨兵错误:

_ = &json.SyntaxError{msg: "unexpected end of JSON input", Offset: 0}  // msg field is not exported

最接近的是检查错误类型。为此,请使用errors.As

var tt *json.SyntaxError


if errors.As(err, &tt) {

    log.Printf("Syntax Error: %v", tt)

} else if err != nil {

    log.Fatalf("Fatal: %#v", err)

}

https://go.dev/play/p/mlqGN2ypwBs

您可以检查Offset公共领域。但是要比较非公共msg领域,您需要使用err.Error()- 但这可能很脆弱,因为措辞可能会随着时间而改变。


注意: errors.Is不能在这里使用,因为它只测试错误相等性:直接;或通过error.Unwrap -ing。

由于这里的 json.SyntaxError没有被包装——也不是一个哨兵错误——它不能通过匹配errors.Is


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信