Json 缓冲区字符串()不等于字符串

Json 缓冲区字符串()不等于字符串,json,string,http,testing,go,Json,String,Http,Testing,Go,我尝试测试我的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.NewEnc

我尝试测试我的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\"}"
在测试中,我发现json encode附加了一个换行符,但即使使用了该信息,我也无法使测试正常工作:-/

提前感谢您的帮助。

您发送的消息:

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封送了一个字符串值,其内容为{status:OK}。JSON编码将把这个文本引用到一个带反斜杠的有效JSON字符串前缀引号中,放在引号中,并附加一个换行符。因此,这将成为原始字符串:

expected := `"{\"status\": \"OK\"}"
`
使用这个期望值,你的测试通过了,但同样,你想要的是这个答案的第一部分

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

expected := "\"{\\\"status\\\": \\\"OK\\\"}\"\n"
您发送的消息:

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封送了一个字符串值,其内容为{status:OK}。JSON编码将把这个文本引用到一个带反斜杠的有效JSON字符串前缀引号中,放在引号中,并附加一个换行符。因此,这将成为原始字符串:

expected := `"{\"status\": \"OK\"}"
`
使用这个期望值,你的测试通过了,但同样,你想要的是这个答案的第一部分

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

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

断线是个问题。我设法通过添加字符串来解决这个问题。TrimRight和cut if直接从字符串中删除

if strings.TrimRight(rr.Body.String(), "\n") != expected {
    t.Errorf("handler returned unexpected body: got %v want %v",
        rr.Body.String(), expected)
    }

断线是个问题。我设法通过添加字符串来解决这个问题。TrimRight和cut if直接从字符串中删除

if strings.TrimRight(rr.Body.String(), "\n") != expected {
    t.Errorf("handler returned unexpected body: got %v want %v",
        rr.Body.String(), expected)
    }

预期:=`{状态:好}`这在{之前有一个额外的。这可能是个问题吗?@Shinratensei:谢谢你的提示。编辑了片段,但没有解决问题:是的,我知道,这对我来说只是一个奇怪的问题。看看答案,他们对GolangeExpected了解更多:=`{状态:好}`这在{。这可能是个问题吗?@Shinratensei:谢谢你的提示。编辑了片段,但没有解决问题:是的,我知道,这对我来说只是一件奇怪的事情。看看答案,他们对Golang了解得更多谢谢你的快速回复:更改了预期但得到了handler_测试。go:244:handler返回了意外的body:Get{\status\:\OK\}想要{\status\:\OK\}谢谢,这个测试解决了这个问题,但是我得到了另一个我必须使用json.encode的。我自己找到了一个问题的解决方案。感谢快速响应:更改了预期但得到的处理程序\u测试。go:244:处理程序返回了意外的正文:得到{\status\:\OK\}想要{\status\:\OK\}谢谢,这解决了这个测试的问题,但是我得到了另一个我必须使用json.encode的方法。我自己找到了解决这个问题的方法。