2016-11-24 7 views
0

golangでhttpサーバをテストしていますが、すべて迷惑なことを除いてすべてがかなりスムーズです。golangのHTTPハンドラを単体テスト用にリセットする

私は、サーバーを設定していたときに、いくつかの時点で、私はhttp.Handle("/", myrouter)でハンドラを登録http.ListenAndServeを行う前に、問題は、設定方法が再び呼び出され、次のテスト、に、私は次のパニックを受けるということです。

パニックます。http:/ための複数の登録[復元]

私はクリーンな環境で各テストを実行したいのですが、http.DefaultServeMuxを取り壊すための方法を発見していない、そこにありますこれを行うための便利な方法は、 "nulling" somet新しい環境ですべてのテストが実行されるようにテスト環境をヒンジまたは再構成する


編集: いくつかのコンテキストを与えることを、尋ねたとして、私はここにいくつかのコードと私が書きたかったテストを投稿し、私は私もわから上じゃないという事実を明確にタフでなければなりません実装の選択はここで行われました(私は少し異なった方法でサーバを設定したと思いますが、コードは私のものではありません)。私はパニックを取得し、ハンドルが二回httpに結合呼んでいるので、しかし

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") 
    } 

} 

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 
} 

は今、私が書きたかったテストは次のように、非常に簡単でした。

+1

テストはどのように定義されていますか?あなたを助けるためのコードが必要です。サーバの設定とハンドラコードのテストの両方を送信してください。 – shadyyx

+0

は、文脈のためのいくつかのコードを追加しました。申し訳ありません、私はそれを前にしておくべきでした! –

答えて

0

私は解決策を見つけたと思う:基本的には、各テストの後、私はhttp.DefaultServeMux = new(http.ServeMux)http.DefaultServeMuxを再初期化、私はまだ、これはタフな問題を回避するためにきれいな方法であるか分かりません。

ここで使用されているヒントやヒントを教えてください。私はこの言語には全く触発されておらず、一般的な開発のバックエンドになっています。 上記のHTTP Serverの設定にコードの匂いがあるかもしれないと思うのですが、それを指摘すれば、私のチームの残りの人には明らかになり、より良い解決策を出すかもしれません。

+0

まあ、例によっては、これは 'gorilla/mux'をオプトインするために行うべきことです。代わりに' gorilla/mux'をrootにバインドします:https://github.com/gorilla/mux #examples –

0

私はあなたがhttptest pkgを使用して見るべきだと思います。それには、毎回新鮮なテストを開始できるサーバーがあります。

関連する問題