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 關注
- 171 瀏覽
添加回答
舉報
0/150
提交
取消