高度なテストのための HTTP クライアントのモック
堅牢で信頼性の高いソフトウェア テストを追求する場合、HTTP クライアントのモックは基本的な実践です。ただし、カスタム インターフェイスでこれを実現するのは難しい場合があります。
基本認証を使用した HTTP GET リクエストでインターフェイス HttpClient が使用される次のシナリオを考えてみましょう。
func GetOverview(client HttpClient, overview *Overview) (*Overview, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s:%s/api/overview", overview.Config.Url, overview.Config.Port), nil) if (err != nil) { log.Println(err) } request.SetBasicAuth(overview.Config.User, overview.Config.Password) resp, err := client.Do(request) if (err != nil) { return nil, err } if resp.StatusCode != 200 { return nil, fmt.Errorf("Bad StatusCode: %v", resp.StatusCode) } return overview, nil }
HTTP をモックしてシミュレートするには応答すると、私たちはジレンマに直面します。 gock などの既存のモック ライブラリは、GET や POST などの特定の HTTP メソッドのモックのみをサポートしています。
カスタム モック アプローチ
この HttpClient をモックする鍵となるのは、次の実装です。カスタム Mock 構造体とのインターフェイス。たとえば、対応する Do メソッドを使用して ClientMock 構造体を定義できます。
type ClientMock struct { } func (c *ClientMock) Do(req *http.Request) (*http.Response, error) { // Simulate HTTP response with custom logic return &http.Response{}, nil }
Mock の組み込み
この Mock 構造体を配置すると、それを注入できます。 GetOverview 関数に入力します。以下に例を示します。
mock := ClientMock{} overview, err := GetOverview(&mock, &overview)
ClientMock を使用すると、シミュレートされた HTTP 応答を制御でき、外部の HTTP サーバーやサービスに依存せずに包括的な単体テストが可能になります。
以上が高度な Go テストのために HTTP クライアントを効果的にモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。