c.BindQuery が呼び出されるときに、Gin ハンドラー関数 GetMaterialByFilter の単体テストが失敗する。関数をモックすることでこの問題はどのように解決できますか?
この問題は、テスト中に実際の HTTP リクエストが存在しないことが原因で発生します。 HTTP ベースの操作を実行するには、リクエストを初期化し、Gin コンテキストに設定する必要があります。特に、c.BindQuery の場合、リクエストの URL と URL.RawQuery を適切に初期化することが重要です。
c.BindQuery をモックするには、次の手順に従います。
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 サイトの他の関連記事を参照してください。