【问题标题】:Buffer string() not equal string缓冲区字符串()不等于字符串
【发布时间】:2017-12-29 17:17:31
【问题描述】:

我尝试测试我的 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 编码附加换行符的内容,但即使使用该信息,我也无法让测试正常工作:-/

提前感谢您的帮助。

【问题讨论】:

  • expected := `"{"status": "OK"}` 这在 { 之前有一个额外的 "。这可能是个问题吗?
  • @Shinratensei:感谢您的提示。编辑了sn-p,但没有解决问题:(
  • 是的,我知道,这对我来说看起来很奇怪。看答案,他们更了解golang

标签: json string http testing go


【解决方案1】:

您发送的消息:

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 值,您的测试通过了,但同样,您想要的是这个答案的第一部分。

如果您想使用解释字符串文字来描述 expected 值,它可能如下所示:

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

【讨论】:

  • 感谢您的快速回复:更改了预期但得到了 handlers_test.go:244:处理程序返回了意外的正文:得到了“{\”status\”:\“OK\”}”想要{\“status \": \"OK\"}
  • 谢谢,这解决了这个测试,但我得到了另一个我必须使用 json.encode 的地方。我自己找到了解决问题的方法。
【解决方案2】:

换行是问题所在。我设法通过添加 strings.TrimRight 来解决它,如果直接从字符串中删除。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多