[英]Unit testing http json response in Golang
我使用gin
作為我的 http 服務器,並在 json 中發回一個空數組作為我的響應:
c.JSON(http.StatusOK, []string{})
我得到的結果 json 字符串是"[]\n"
。 換行符由 json Encoder 對象添加,請參見此處。
使用goconvey
,我可以像測試我的 json
So(response.Body.String(), ShouldEqual, "[]\n")
但是有沒有比僅僅為所有字符串添加換行符更好的方法來生成預期的 json 字符串?
您應該首先將響應的主體解組為結構並與結果對象進行比較。 例子:
result := []string{}
if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
log.Fatalln(err)
}
So(len(result), ShouldEqual, 0)
將主體解組為結構並使用 Gocheck 的 DeepEquals https://godoc.org/launchpad.net/gocheck
您可能會發現jsonassert很有用。 它在標准庫之外沒有依賴項,並允許您驗證 JSON 字符串在語義上是否等同於您期望的 JSON 字符串。
在你的情況下:
// white space is ignored, no need for \n
jsonassert.New(t).Assertf(response.Body().String(), "[]")
它可以處理任何形式的 JSON,並且有非常友好的斷言錯誤消息。
免責聲明:我寫了這個包。
我是這樣弄的。 因為我不想包含額外的庫。
tc := testCase{
w: httptest.NewRecorder(),
wantResponse: mustJson(t, map[string]string{"message": "unauthorized"}),
}
...
if tc.wantResponse != tc.w.Body.String() {
t.Errorf("want %s, got %s", tt.wantResponse, tt.w.Body.String())
}
...
func mustJson(t *testing.T, v interface{}) string {
t.Helper()
out, err := json.Marshal(v)
if err != nil {
t.Fatal(err)
}
return string(out)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.