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

时间:2017-07-24 08:02:12

标签: 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.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编码的内容附加了一个换行符,但即使有这些信息,我也无法让测试工作: - /

提前,谢谢你的帮助。

2 个答案:

答案 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)
    }