我在golang中測試一個http服務器,除了一件令人討厭的事情之外,一切似乎都很流暢。重置golang中的http處理程序進行單元測試
在某些時候,當我配置服務器時,在執行http.ListenAndServe
之前,我註冊了一個處理程序http.Handle("/", myrouter)
,問題是在下面的測試中,當再次調用配置方法時,我收到以下恐慌:
恐慌:HTTP:多個註冊爲/ [恢復]
我想運行在一個乾淨的環境中的每個測試,但還沒有找到一種方法來推倒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
手柄結合兩次,我得到的恐慌。
您的測試如何定義?我們需要一些代碼來幫助你。發佈設置服務器以及測試處理程序代碼。 – shadyyx
爲上下文添加了一些代碼。對不起,我應該早點完成! –