NewUnstartedServer
就是这么简单:
func NewUnstartedServer(handler http.Handler) *Server {
return &Server{
Listener: newLocalListener(),
Config: &http.Server{Handler: handler},
}
}
如果您自己 Select 一个端口有效,您可以这样做:
func MyNewUnstartedServer(port int, handler http.Handler) *httptest.Server {
addr := fmt.Sprintf("127.0.0.1:%d", port)
l, err := net.Listen("tcp", addr)
if err != nil {
addr = fmt.Sprintf("[::1]::%d", port)
if l, err = net.Listen("tcp6", addr); err != nil {
panic(fmt.Sprintf("httptest: failed to listen on a port: %v", err))
}
}
return &httptest.Server{
Listener: l,
Config: &http.Server{Handler: handler},
}
}
创建监听程序的代码从httptest.newLocalListener
修改.
另一种 Select 是实现http.RoundTripper
接口,并使用此往返程序创建http.Client
.下面是一个抄袭自net/http/client_test.go的例子:
type recordingTransport struct {
req *Request
}
func (t *recordingTransport) RoundTrip(req *Request) (resp *Response, err error) {
t.req = req
return nil, errors.New("dummy impl")
}
func TestGetRequestFormat(t *testing.T) {
setParallel(t)
defer afterTest(t)
tr := &recordingTransport{}
client := &Client{Transport: tr}
url := "http://dummy.faketld/"
client.Get(url) // Note: doesn't hit network
if tr.req.Method != "GET" {
t.Errorf("expected method %q; got %q", "GET", tr.req.Method)
}
if tr.req.URL.String() != url {
t.Errorf("expected URL %q; got %q", url, tr.req.URL.String())
}
if tr.req.Header == nil {
t.Errorf("expected non-nil request Header")
}
}