2016-11-18 6 views
2

私は以下のようなリクエストハンドラのセットを持っている:Golangでhttpリクエストハンドラをテストするにはどうすればよいですか?

func GetProductsHandler(w http.ResponseWriter, req *http.Request) { 
    defer req.Body.Close() 
    products := db.GetProducts() 

    // ... 
    // return products as JSON array 
} 

は、どのように私は彼らに正しい方法をテストするのですか? ResponseWriterとRequestオブジェクトを関数に送信して結果を確認する必要がありますか?

テストの前にサーバーを起動しなくても、プロセスを簡略化するためにGoに要求オブジェクトと応答オブジェクトを模擬するツールはありますか?

+3

['httptest'パッケージ](https://golang.org/pkg/net/http/httptest/)を意味しますか? – JimB

+0

'http.Request'と' http.Response'の両方がシンプルで完全にエクスポートされたタイプなので、必要なものや必要なものに設定してください。ツールや「嘲笑」の必要はありません。 – Volker

+0

https://golang.org/pkg/net/http/httptest/#example_ResponseRecorder – dm03514

答えて

3

Goは、ハンドラのテストに使用するモックライタを提供します。グローバル依存(db)を有するクリーンユニット・テストにレンチをスローし、私が思う

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/httptest" 
) 

func main() { 
    handler := func(w http.ResponseWriter, r *http.Request) { 
     http.Error(w, "something failed", http.StatusInternalServerError) 
    } 

    req := httptest.NewRequest("GET", "http://example.com/foo", nil) 
    w := httptest.NewRecorder() 
    handler(w, req) 

    fmt.Printf("%d - %s", w.Code, w.Body.String()) 
} 

:標準ライブラリのマニュアルでは、例を提供します。あなたのテストを行って、値をマスキングすると、グローバル値dbを再割り当てすることができます。

別の戦略は、(私の好み)db属性を持つ構造体、であなたのハンドラをパッケージ化する..です

type Handlers struct { 
    db DB_INTERFACE 
} 

func (hs *Handlers) GetProductsHandler(w http.ResponseWriter, req *http.Request) {...} 

テストはあなたをできるようになりますスタブdbオブジェクトとHandlersをインスタンス化することができますこの方法IO空きユニットテストを作成します。

+0

この回答に記載されている「標準ライブラリのドキュメント」は、https://golang.org/pkg/net/http/にあります。 httptest / – Adrian

関連する問題