3 回答
TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個贊
這里的派對超級遲到。
golang 中有一個流行的測試包叫做 require github.com/stretchr/testify/require,它會為你做這件事。
func TestJsonEquality(t *testing.t) {
expected := `{"a": 1, "b": 2} `
actual := ` {"b": 2, "a": 1}`
require.JSONEq(t, expected, actual)
}
GoDocs:https ://godoc.org/github.com/stretchr/testify/require#JSONEqf
TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個贊
您需要將指針傳遞給Decode和Unmarshal。我用和建立了一個可運(yùn)行的樣本,兩者都返回。您可以通過使用或包裝您的預(yù)期內(nèi)容來將請求正文與您的靜態(tài)預(yù)期內(nèi)容進(jìn)行比較(就像您在問題中嘗試做的那樣)。這是代碼:func JSONEqual(a, b io.Reader)JSONBytesEqual(a, b []byte)(bool, error)bytes.NewBufferstrings.NewReader
package main
import (
"encoding/json"
"fmt"
"io"
"reflect"
)
// JSONEqual compares the JSON from two Readers.
func JSONEqual(a, b io.Reader) (bool, error) {
var j, j2 interface{}
d := json.NewDecoder(a)
if err := d.Decode(&j); err != nil {
return false, err
}
d = json.NewDecoder(b)
if err := d.Decode(&j2); err != nil {
return false, err
}
return reflect.DeepEqual(j2, j), nil
}
// JSONBytesEqual compares the JSON in two byte slices.
func JSONBytesEqual(a, b []byte) (bool, error) {
var j, j2 interface{}
if err := json.Unmarshal(a, &j); err != nil {
return false, err
}
if err := json.Unmarshal(b, &j2); err != nil {
return false, err
}
return reflect.DeepEqual(j2, j), nil
}
func main() {
a := []byte(`{"x": ["y",42]}`)
b := []byte(`{"x": ["y", 42]}`)
c := []byte(`{"z": ["y", "42"]}`)
empty := []byte{}
bad := []byte(`{this? this is a test.}`)
eq, err := JSONBytesEqual(a, b)
fmt.Println("a=b\t", eq, "with error", err)
eq, err = JSONBytesEqual(a, c)
fmt.Println("a=c\t", eq, "with error", err)
eq, err = JSONBytesEqual(a, empty)
fmt.Println("a=empty\t", eq, "with error", err)
eq, err = JSONBytesEqual(a, bad)
fmt.Println("a=bad\t", eq, "with error", err)
}
它輸出:
a=b true with error <nil>
a=c false with error <nil>
a=empty false with error EOF
a=bad false with error invalid character 't' looking for beginning of object key string
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個贊
我寫了一個工具來比較基于 http json 的響應(yīng),但我忽略了順序。可以看一下實(shí)現(xiàn)比較和抓取Equal函數(shù)的包:https : //github.com/emacampolo/gomparator/blob/master/json_util.go#L10
例如:
b1 := []byte(`{"x": {"t": 1, "s": 2}, "z": 1}`)
b2 := []byte(`{"z": 1, "x": {"s": 2, "t": 1}}`)
j1, _ := Unmarshal(b1)
j2, _ := Unmarshal(b2)
assert.True(t, Equal(j1, j2))
- 3 回答
- 0 關(guān)注
- 269 瀏覽
添加回答
舉報
