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 중국어 웹사이트의 기타 관련 기사를 참조하세요!