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

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()?


素胚勾勒不出你
浏览 128回答 1
1回答

眼眸繁星

首先,不可能直接制作这个哨兵错误:_ = &json.SyntaxError{msg: "unexpected end of JSON input", Offset: 0}  // msg field is not exported最接近的是检查错误类型。为此,请使用errors.Asvar tt *json.SyntaxErrorif 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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go