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
。
- 1 回答
- 0 关注
- 127 浏览
添加回答
举报
0/150
提交
取消