2017-09-21 18 views
1

私は、書込みユニットが定義の一部としてコンテキストを使用するハンドラをテストする方法を理解しようとしていました。定義内のコンテキストを使用してハンドラでhttptestを使用して単体テストを書く方法?

func Handler(ctx context.Context, w http.ResponseWriter, r *http.Request)

私はに私がエラーを与えられたこのようなテストを実施しようとすると、それは

//copied right from the article 

rr := httptest.NewRecorder() 
// e.g. func GetUsersHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) 
handler := http.HandlerFunc(GetUsersHandler) 

のような単純なようで作られたこのarticle accrossに来たいくつかのグーグルでの後

cannot convert Handler (type func("context".Context, http.ResponseWriter, *http.Request)) to type http.HandlerFunc 

は、だから私はHandleFuncの定義に運転し、

// The HandlerFunc type is an adapter to allow the use of 
// ordinary functions as HTTP handlers. If f is a function 
// with the appropriate signature, HandlerFunc(f) is a 
// Handler that calls f. 
type HandlerFunc func(ResponseWriter, *Request) 

// ServeHTTP calls f(w, r). 
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { 
    f(w, r) 
} 

を見つけたので、エラーが理にかなって...しかし、私はこのハンドラをテストする必要があると私ができるように、それはいないようですので、今、私は失うによ記事を参考にしてhttptestを使用してください。

httptestパッケージでハンドラをテストする方法はありますか?もし私がどのようにテストする必要がありますか?私はGo1.9

UPDATE

//Just so its clear this is what I'm currently trying to do 

data := url.Values{} 
data.Set("event_type", "click") 
data.Set("id", "1") 
data.Set("email", "") 

req, err := http.NewRequest("PUT", "/", bytes.NewBufferString(data.Encode())) 
Expect(err).To(BeNil()) 

rr := httptest.NewRecorder() 
// this is the problem line. 
// The definition of Handler isn't (w ResponseWriter, r *Request) 
// So I can't create a handler to serve my mock requests 
handler := http.HandlerFunc(Handler) 

handler.ServeHTTP(rr, req) 
+0

'http.Request'がすでにコンテキストをサポートしているときにハンドラを別のパラメータとして渡すのはなぜですか? – Adrian

+0

これは、Go1.7以前の従来のコードです。アプリ全体がこのように構築されています。私は新しいルートを追加するだけです。それでも、この記事は、これが行われ、例として行われたようなものだったように見えました。記事の有効期限はまだ分かりません。 – reticentroot

答えて

1

httptestを使用してい

は、あなただけの適切な偽物を作成する必要があり、あなたはテスト目的のために偽のRequestResponseWriterを作成するために必要なものがすべて含まれContext (それがあなたの状況を意味するものであれば)、すべて3をハンドラ関数に渡して、ResponseWriterに書き込むものを検証します。

ctx := MakeMyContext() 
w := httptest.NewRecorder() 
r := httptest.NewRequest("GET", "/myroute", nil) 
// headers etc 
MyHandler(ctx,w,r) 
// Validate status, body, headers, whatever in r 
+0

クール、私はまだ動作すると思う、確認する秒を与える – reticentroot

関連する問題