如何处理 go 测试用例中的 json 语法错误?
How to handle json syntax error in a go test case?
我正在测试 json.Unmarshall
失败且 returns
的场景
&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()
?
首先not possible直接制作这个哨兵错误:
_ = &json.SyntaxError{msg: "unexpected end of JSON input", Offset: 0} // msg field is not exported
最接近的是检查错误 type。为此,请使用 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
,因为那是 public 字段。但是要比较 non-public msg
字段,您需要使用 err.Error()
- 但随着时间的推移,may change 的措辞可能会变得脆弱。
注: errors.Is cannot be used here, as it only tests error equality: directly; or via error.Unwrap-ing.
因为 json.SyntaxError here is not wrapped - nor is it a sentinel error - 它无法通过 errors.Is
匹配。
我正在测试 json.Unmarshall
失败且 returns
&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()
?
首先not possible直接制作这个哨兵错误:
_ = &json.SyntaxError{msg: "unexpected end of JSON input", Offset: 0} // msg field is not exported
最接近的是检查错误 type。为此,请使用 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
,因为那是 public 字段。但是要比较 non-public msg
字段,您需要使用 err.Error()
- 但随着时间的推移,may change 的措辞可能会变得脆弱。
注: errors.Is cannot be used here, as it only tests error equality: directly; or via error.Unwrap-ing.
因为 json.SyntaxError here is not wrapped - nor is it a sentinel error - 它无法通过 errors.Is
匹配。