以下是一个示例代码:
package main
import (
"net/http"
)
func Home(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, world!"))
}
func Router() *http.ServeMux {
mux := http.NewServeMux()
mux.HandleFunc("/", Home)
return mux
}
func main() {
mux := Router()
http.ListenAndServe(":8080", mux)
}
这是我写的测试案例:
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestMain(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
Router().ServeHTTP(w, r)
if w.Body.String() != "Hello, world!" {
t.Error("Wrong content:", w.Body.String())
}
}
此测试是否真的通过TCP套接字发送HTTP请求并到达终点/
?或者这只是在没有建立HTTP连接的情况下调用函数?
更新
基于@ffk给出的答案,我写了这样的测试:
func TestMain(t *testing.T) {
ts := httptest.NewServer(Router())
defer ts.Close()
req, _ := http.NewRequest("GET", ts.URL+"/", nil)
client := http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
if string(body) != "Hello, world!" {
t.Error("Wrong content:", string(body))
}
}
答案 0 :(得分:1)
如果要实例化可通过127.0.0.1上的随机tcp端口访问的测试服务器,请使用以下命令:
httpHandler := getHttpHandler() // of type http.Handler
testServer := httptest.NewServer(httpHandler)
defer testServer.Close()
request, err := http.NewRequest("GET", testServer.URL+"/my/url", nil)
client := http.Client{}
response, err := client.Do(request)
有关详细信息,请参阅https://golang.org/pkg/net/http/httptest/#NewServer