【发布时间】:2015-10-12 01:10:42
【问题描述】:
尝试在 Go 测试中模拟 http 响应。如果我用
运行下面的代码 sn-p 永远不会终止去测试 example.com/auth/...
package auth_test
import (
"testing"
"net/http/httptest"
"net/http"
)
func TestAuthorization(t *testing.T) {
t.Log("Should return 401 when Gateway returns 401")
{
url := oneOffUrlWithResponseCode(http.StatusUnauthorized)
request, _ := http.NewRequest("GET", url, nil)
response, _ := http.DefaultClient.Do(request)
if response.StatusCode != http.StatusUnauthorized {
t.Fatalf("Response should be 401 (Unauthorized)")
}
}
}
func oneOffUrlWithResponseCode(responseCode int) string {
var server *httptest.Server
server = httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
defer server.Close()
response.WriteHeader(responseCode)
}))
return server.URL
}
但是,如果我注释掉这一行
延迟 server.Close()
一切正常。
理想情况下,我不想在 oneOffUrlWithResponseCode 函数之外“泄漏” *httptest.Server 并且在第一次请求后显然将其关闭。
为什么它永远不会终止?我究竟做错了什么?什么是正确的做法?
【问题讨论】:
-
只是好奇,为什么要隐藏服务器。返回服务器似乎很合理,因为它预计将用于测试,例如。服务器被创建并且服务器被测试关闭(而不是在它的回调中)。
标签: unit-testing go closures