gpt4 book ai didi

json - 缓冲区字符串()不等于字符串

转载 作者:IT王子 更新时间:2023-10-29 01:54:22 26 4
gpt4 key购买 nike

我尝试测试我的 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 编码,但即使我将预期更改为

expected := `"{\"status\": \"OK\"}"`

不行,测试结果是

handlers_test.go:244: handler returned unexpected body: got "{\"status\": \"OK\"}"
want "{\"status\": \"OK\"}"

docs我发现 json 编码附加了一个换行符,但即使使用该信息我也无法使测试工作:-/

预先感谢您的帮助。

最佳答案

您发送的消息:

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"}`

解释您的原始代码:

在您的原始代码中,您对单个 string 值进行了 JSON 编码,其内容为 {"status": "OK"}。 JSON 编码会将此文本引用到有效的 JSON 字符串中(使用反斜杠作为前缀引号),放入引号内,并附加一个换行符。所以这变成了原始字符串:

expected := `"{\"status\": \"OK\"}"
`

使用此预期 值,您的测试通过了,但同样,您想要的是此答案的第一部分。

如果您想使用解释的字符串文字来描述预期的值,它可能是这样的:

expected := "\"{\\\"status\\\": \\\"OK\\\"}\"\n"

关于json - 缓冲区字符串()不等于字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45275185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com