推荐答案
在 Go 语言中,httptest 包提供了用于测试 HTTP 客户端和服务器的工具。以下是一个使用 httptest 包进行 HTTP 测试的示例:
// www.javascriptcn.com code example
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func TestHelloHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/hello", nil)
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(helloHandler)
handler.ServeHTTP(rr, req)
if status := rr.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
expected := "Hello, World!"
if rr.Body.String() != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rr.Body.String(), expected)
}
}本题详细解读
1. 创建 HTTP 请求
首先,我们需要创建一个 http.Request 对象来模拟客户端请求。在这个例子中,我们使用 http.NewRequest 方法创建了一个 GET 请求,请求路径为 /hello。
req, err := http.NewRequest("GET", "/hello", nil)
if err != nil {
t.Fatal(err)
}2. 创建 ResponseRecorder
httptest.NewRecorder 返回一个 httptest.ResponseRecorder 对象,它可以记录 HTTP 处理程序的响应。这个对象实现了 http.ResponseWriter 接口,因此可以传递给处理程序。
rr := httptest.NewRecorder()
3. 调用处理程序
我们将 helloHandler 函数包装为 http.HandlerFunc,然后调用 ServeHTTP 方法来处理请求并记录响应。
handler := http.HandlerFunc(helloHandler) handler.ServeHTTP(rr, req)
4. 检查响应
最后,我们检查响应的状态码和响应体是否符合预期。
// www.javascriptcn.com code example
if status := rr.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
expected := "Hello, World!"
if rr.Body.String() != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rr.Body.String(), expected)
}通过这种方式,我们可以轻松地测试 HTTP 处理程序的行为,确保它们按预期工作。