我尝试测试我的http处理程序是否在正文中返回正确的值。
这是我的处理函数
func Index(w http.ResponseWriter, r *http.Request){
message := `{"status": "OK"}`
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
if err := json.NewEncoder(w).Encode(message); err != nil {
panic(err)
}
}
这是我的测试
func TestIndex(t *testing.T){
req, err := http.NewRequest("GET", "/", nil)
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(Index)
handler.ServeHTTP(rr, req)
expected := `"{"status": "OK"}"`
if rr.Body.String() != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rr.Body.String(), expected)
}
}
测试结果如下:
handlers_test.go:244: handler returned unexpected body: got "{\"status\": \"OK\"}"
want {"status": "OK"}
我认为逃避"是因为json Encode,但即使我将预期更改为
expected := `"{\"status\": \"OK\"}"`
它不起作用,而不是测试结果
handlers_test.go:244: handler returned unexpected body: got "{\"status\": \"OK\"}"
want "{\"status\": \"OK\"}"
在docs中,我发现json编码的内容附加了一个换行符,但即使有这些信息,我也无法让测试工作: - /
提前,谢谢你的帮助。
答案 0 :(得分:4)
您发送的邮件:
message := `{"status": "OK"}`
已经是有效的JSON文本,您不需要对其进行任何进一步的JSON编码/处理。只需按原样发送:
func Index(w http.ResponseWriter, r *http.Request){
message := `{"status": "OK"}`
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
io.WriteString(w, message)
}
另请注意,如果您的回复代码为http.StatusOK
,则无需明确设置,因为如果您没有设置,则默认设置。
然后只是期待以下回应:
expected := `{"status": "OK"}`
解释您的原始代码:
在原始代码中,您使用JSON封送了一个string
值,其内容为{"status": "OK"}
。 JSON编码将此文本引用到有效的JSON字符串(前缀带有反斜杠的引号),放在引号内,还附加换行符。所以这就变成了原始字符串:
expected := `"{\"status\": \"OK\"}"
`
使用此expected
值,您的测试会通过,但同样,您想要的是此答案的第一部分。
如果您想使用解释的字符串文字来描述expected
值,它的外观如下:
expected := "\"{\\\"status\\\": \\\"OK\\\"}\"\n"
答案 1 :(得分:0)
换行是问题所在。我设法通过添加strings.TrimRight解决它,如果正确的话,切断字符串。
if strings.TrimRight(rr.Body.String(), "\n") != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rr.Body.String(), expected)
}