我知道这是一个老问题,但它仍然出现在搜索结果中,所以我想我会给出一个可能的答案。
您可以将代码隔离到返回“teardown”函数以自行清理的辅助函数。这是启动服务器并在测试用例结束时关闭它的一种可能方法。
func setUpServer() (string, func()) {
h := func(w http.ResponseWriter, r *http.Request) {
code := http.StatusTeapot
http.Error(w, http.StatusText(code), code)
}
ts := httptest.NewServer(http.HandlerFunc(h))
return ts.URL, ts.Close
}
func TestWithServer(t *testing.T) {
u, close := setUpServer()
defer close()
rsp, err := http.Get(u)
assert.Nil(t, err)
assert.Equal(t, http.StatusTeapot, rsp.StatusCode)
}
这将使用net/http/httptest 启动服务器并返回其 URL 以及充当“拆卸”的函数。该函数被添加到延迟堆栈中,因此无论测试用例如何退出,它都会被调用。
如果您在其中进行更复杂的设置并且需要处理错误,您可以传入*testing.T(可选)。此示例显示设置函数返回 *url.URL 而不是 URL 格式的字符串,并且解析可能会返回错误。
func setUpServer(t *testing.T) (*url.URL, func()) {
h := func(w http.ResponseWriter, r *http.Request) {
code := http.StatusTeapot
http.Error(w, http.StatusText(code), code)
}
ts := httptest.NewServer(http.HandlerFunc(h))
u, err := url.Parse(ts.URL)
assert.Nil(t, err)
return u, ts.Close
}
func TestWithServer(t *testing.T) {
u, close := setUpServer(t)
defer close()
u.Path = "/a/b/c/d"
rsp, err := http.Get(u.String())
assert.Nil(t, err)
assert.Equal(t, http.StatusTeapot, rsp.StatusCode)
}