2

如何创建用于测试目的的“损坏”表单,http.Client这将在处理程序函数中触发响应错误ParseForm()

我有以下代码:

func (app *App) signupUser(w http.ResponseWriter, r *http.Request) {
    err := r.ParseForm()
    if err != nil { // how to trigger this if statement?
        sendStatus(w, http.StatusBadRequest, "error parsing form")
        return
    }
...

然后在测试期间我http.Client用来测试这个控制器:

resp, err = client.PostForm(ts.URL+"/user/signup", url.Values{
            "email":      {testEmail},
            "password":   {goodPassword},
)
if err != nil { 
  t.Error(err) // I never get here
}
4

1 回答 1

2

首先client.PostForm将完成填充帖子表单的正确工作,因此您必须手动填充它。

然后,如果您深入研究 的调用堆栈r.ParseForm(),您最终会找到错误产生者(除非出现阅读问题等):

"net/url".QueryUnescape其中 "如果任何 % 后面没有两个十六进制数字,则返回错误。 "

因此,例如:

    r := &http.Request{
        // ensures it reads the body
        Method: "POST", 
        // string with bad url encoding '%3z'
        Body: io.NopCloser(strings.NewReader("foo%3z1%26bar%3D2")),
        // ensures it parses the body as post form
        Header: map[string][]string{
            "Content-Type": []string{
                "application/x-www-form-urlencoded",
            },
        },
    }
    err := r.ParseForm()
    if err == nil {
        panic("no err")
    }
    // err -> invalid URL escape "%3z"
于 2021-04-11T17:21:09.587 回答