创建测试请求时如何模拟简单的 POST 正文

m90*_*m90 4 post unit-testing http go

我正在尝试为简单的表单处理程序编写单元测试。我找不到有关如何以r.ParseForm()我的处理程序中选取的方式创建表单主体的任何信息。我可以自己查看和读取正文,但r.Form在我的测试中url.Values{},它始终在我的应用程序中按预期工作。

代码归结为以下示例

package main

import (
    "fmt"
    "strings"
    "net/http"
    "net/http/httptest"

)

func main() {
    w := httptest.NewRecorder()
    r := httptest.NewRequest(http.MethodPost, "/", strings.NewReader("a=1&b=2"))
    handler(w, r)
}

func handler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    fmt.Printf("form: %#v\n", r.Form)
}
Run Code Online (Sandbox Code Playgroud)

那个打印

form: url.Values{}
Run Code Online (Sandbox Code Playgroud)

当我希望它打印时:

form: url.Values{"a": []string{"1"}, "b": []string{"2"}}
Run Code Online (Sandbox Code Playgroud)

我如何实际将身体传递给httptest.NewRequest以便它被捡起r.ParseForm

mko*_*iva 7

您只需要Content-Type在请求上设置标头。

package main

import (
    "fmt"
    "strings"
    "net/http"
    "net/http/httptest"

)

func main() {
    w := httptest.NewRecorder()
    r := httptest.NewRequest(http.MethodPost, "/", strings.NewReader("a=1&b=2"))
    r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    handler(w, r)
}

func handler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    fmt.Printf("form: %#v\n", r.Form)
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/KLhNHbbNWl