如何处理 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 匹配。