ホームページ >バックエンド開発 >Golang >効果的な単体テストのために、Gin の「c.BindQuery」をモックするにはどうすればよいですか?

効果的な単体テストのために、Gin の「c.BindQuery」をモックするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-30 15:43:14507ブラウズ

How to Mock Gin's `c.BindQuery` for Effective Unit Testing?

単体テスト用の Gin ハンドラー c.BindQuery のモック

問題

c.BindQuery が呼び出されるときに、Gin ハンドラー関数 GetMaterialByFilter の単体テストが失敗する。関数をモックすることでこの問題はどのように解決できますか?

概要

この問題は、テスト中に実際の HTTP リクエストが存在しないことが原因で発生します。 HTTP ベースの操作を実行するには、リクエストを初期化し、Gin コンテキストに設定する必要があります。特に、c.BindQuery の場合、リクエストの URL と URL.RawQuery を適切に初期化することが重要です。

モック実装

c.BindQuery をモックするには、次の手順に従います。

  1. *gin.Context を初期化し、 *httptest.ResponseRecorder.
  2. *http.Request を作成し、必要に応じてその URL とヘッダーを設定します。
  3. リクエスト クエリ (weldprogs.QueryParam) を初期化し、URL.RawQuery にエンコードします。
  4. c.Request = を使用して、Gin コンテキストにリクエストを設定します。 req.
func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    req := &http.Request{
        URL:    &url.URL{},
        Header: make(http.Header),
    }

    testQuery := weldprogs.QueryParam{/* init fields */}
    q := req.URL.Query()
    for _, s := range testQuery.Basematgroup_id {
        q.Add("basematgroup_id", s)
    }

    req.URL.RawQuery = q.Encode()
    c.Request = req

    return c, w
}

外部依存関係のモック

さらに、services.WeldprogService.GetmaterialByFilter(&queryParam) 呼び出しは、現在の形式ではテストできません。これはインターフェイスであり、ハンドラーの依存関係として挿入される必要があります。

依存関係の挿入

func GetMaterialByFilter(c *gin.Context) {
    //...
    weldprogService := mustGetService(c)
    materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam)
    // ...
}

func mustGetService(c *gin.Context) services.WeldprogService {
    svc, exists := c.Get("svc_context_key")
    if !exists {
        panic("service was not set")
    }
    return svc.(services.WeldprogService)
}

依存関係のモック

type mockSvc struct {
}

// have 'mockSvc' implement the interface 

func TestGetMaterialByFilter(t *testing.T) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // now you can set mockSvc into the test context
    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}

これらの手法を組み合わせることで、 c.BindQuery と外部依存関係を効果的にモックできるため、Gin ハンドラー関数の包括的な単体テストが可能になります。

以上が効果的な単体テストのために、Gin の「c.BindQuery」をモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。