2016-11-24 153 views
0

我在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手柄結合兩次,我得到的恐慌。

+1

您的測試如何定義?我們需要一些代碼來幫助你。發佈設置服務器以及測試處理程序代碼。 – shadyyx

+0

爲上下文添加了一些代碼。對不起,我應該早點完成! –

回答

0

我想我已經找到了解決辦法:每次測試後基本上我重新初始化http.DefaultServeMuxhttp.DefaultServeMux = new(http.ServeMux) 我仍然不知道這是要解決問題的強硬的清潔方式。

我懇請您給我任何提示或指出我在這裏使用的一些不好的做法,因爲我對語言和後端開發一般都很陌生。 我認爲上面顯示的HTTP服務器的配置中可能存在一些代碼異味,如果您指出,我可能會向我的團隊的其他成員表明清楚,並提供更好的解決方案。

+0

好吧,從他們的例子來看,這是你應該做的選擇'大猩猩/多路複用器'你把它綁定在根上,而不是配置'gorilla/mux':https://github.com/gorilla/mux #例子 –

0

我想你應該看看使用httptest pkg。它有服務器,你可以開始新的每一個測試。