Go 中的 httptest 包允许对 HTTP 处理程序、服务器和响应主体进行全面测试。它提供两大类测试:响应测试和服务器测试。
响应测试验证 HTTP 响应的具体内容。这是一个示例:
func TestHeader3D(t *testing.T) { resp := httptest.NewRecorder() // Create a request with specified parameters. param := make(url.Values) param["param1"] = []string{"/home/test"} param["param2"] = []string{"997225821"} req, err := http.NewRequest("GET", "/3D/header/?"+param.Encode(), nil) if err != nil { t.Fatal(err) } // Send the request to the default HTTP server. http.DefaultServeMux.ServeHTTP(resp, req) // Read the response body. body, err := ioutil.ReadAll(resp.Body) if err != nil { t.Fail() } // Check the response body for expected content. if strings.Contains(string(body), "Error") { t.Errorf("header response shouldn't return error: %s", body) } else if !strings.Contains(string(body), `expected result`) { t.Errorf("header response doen't match:\n%s", body) } }
服务器测试涉及设置 HTTP 服务器并向其发出请求。这对于测试自定义 HTTP 处理程序和服务器行为特别有用。让我们看一个例子:
func TestIt(t *testing.T) { // Create an HTTP server with a mock handler. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") fmt.Fprintln(w, `{"fake twitter json string"}`) })) defer ts.Close() // Update the Twitter URL with the mock server's URL and retrieve a channel for results. twitterUrl = ts.URL c := make(chan *twitterResult) go retrieveTweets(c) // Receive and verify the results. tweet := <-c if tweet != expected1 { t.Fail() } tweet = <-c if tweet != expected2 { t.Fail() } }
在提供的代码中,在 err = json.Unmarshal(body, &r) 中不必要地使用了指向 r(接收器)的指针,因为 r 已经是一个指针。因此,应将其更正为 err = json.Unmarshal(body, r).
以上是Go 的 httptest 包如何促进 HTTP 处理程序和服务器的全面测试?的详细内容。更多信息请关注PHP中文网其他相关文章!