我正在测试Golang中的HTTP服务器,除了一个令人烦恼的问题外,一切似乎都很顺利。
在配置服务器之前,在执行`http.ListenAndServe`之前,我使用`http.Handle("/", myrouter)`注册处理程序。然而,在以下测试中,当再次调用配置方法时,会收到以下panic:
``` panic: http: multiple registrations for / [recovered] ```
我想在干净的环境中运行每个测试,但是还没有找到一种方法来拆除`http.DefaultServeMux`。是否有一种方便的方法可以通过“空值”或重新配置测试环境来执行每个测试并在新环境中执行?
在配置服务器之前,在执行`http.ListenAndServe`之前,我使用`http.Handle("/", myrouter)`注册处理程序。然而,在以下测试中,当再次调用配置方法时,会收到以下panic:
``` panic: http: multiple registrations for / [recovered] ```
我想在干净的环境中运行每个测试,但是还没有找到一种方法来拆除`http.DefaultServeMux`。是否有一种方便的方法可以通过“空值”或重新配置测试环境来执行每个测试并在新环境中执行?
package httpserver
import (
"github.com/gorilla/mux"
"github.com/private/private/httpserver/rpchandler"
"net/http"
)
type HTTPServer struct {
router *mux.Router
port int
}
// Config is used to override the default port of the http server.
type Config struct {
Port *int
}
func NewHTTPServer(config *Config) (*HTTPServer, error) {
hs := &HTTPServer{
port: 80,
}
// Overwrite default port if passed.
if config != nil && config.Port != nil {
hs.port = *config.Port
}
err := hs.router = mux.NewRouter().StrictSlash(false)
if err != nil {
return nil, err
}
// other mux router configs here...
http.Handle("/", hs.router)
return hs, nil
}
现在,我想要编写的测试非常简单,比如:
func TestThatServerIsInitializedWithDefaultPort(t *testing.T) {
sut, _ := NewHTTPServer(nil)
if sut.port != 80 {
t.Fatal("default port not configured")
}
}
func TestThatServerDefaultPortIsOverriddenWithConfig(t *testing.T) {
mockPort := 8080
c := Config{
Port: &mockPort,
}
sut, _ := NewHTTPServer(&c)
if sut.port != 8080 {
t.Fatal("the port has not been overridden with the one passed in configuration")
}
}
然而,由于我在http
上调用了两次句柄绑定,导致出现了恐慌。