2017-03-05 5 views
0

を保存するために、ゴリラマルチプレクサは...そうのように使用することが示唆されて素晴らしいですが、それは私の葉golangゴリラ/マルチプレクサおよびテストは、どこのルート私が見ているドキュメントのほとんどで

func main() { 
    m := mux.Router() 
    m.HandleFunc("/", FuncNameOrDef) 
    http.ListenAndServe(":8080", m) 
} 

問題と、その後、私の知る限り、テストするために、私はこのような関数の外にマルチプレクサとルートを宣言しない限り、マルチプレクサとルートを再宣言する必要があるため...

var (
    m = mux.Router() 
    _ = m.HandleFunc("/", FuncNameOrDef) 
) 

し、その後で私のテストはこれを行う...

func TestSomeView(t *testing.T) { 
    ts := httptest.NewServer(m) 
    ....testing blah 
} 

これは問題を解決しますが、パッケージをかなり醜いものにします(_ = m.HandleFuncのすべてで)これを行うにはもっと慣れ親しんだ方法がありますか?

答えて

2

ファクトリ関数を使用して、アプリケーション用に新しいhttp.Handlerを作成することができます。これにより、ハンドラをプログラムで定義し、テストで再利用することができます。

// NewApplicationHandler provides a configured handler for the 
// application. 
func NewApplicationHandler() http.Handler { 
    mux := mux.NewRouter() 
    mux.HandleFunc("/", handler) 

    return mux 
} 

func handler(w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("Hello World!")) 
} 

この例ではそうのような試験に利用されるであろう:

func TestApplicationServeMux(t *testing.T) { 
    // The handlers are being obtained via a call to the factory function. 
    applicationHandler := NewApplicationHandler() 

    ts := httptest.NewServer(applicationHandler) 
    defer ts.Close() 

    res, err := http.Get(ts.URL) 

    if err != nil { 
     t.Fatalf("%s", err) 
    } 

    defer res.Body.Close() 
    greeting, err := ioutil.ReadAll(res.Body) 

    if err != nil { 
     log.Fatalf("%s", err) 
    } 

    want := []byte("Hello World!") 

    if !bytes.Equal(want, greeting) { 
     t.Errorf("Expected greeting %s; got %s", want, greeting) 
    } 

} 
関連する問題