Gin 핸들러 함수 단위 테스트에서 c.BindQuery 모의
Go Gin 핸들러 기능 단위 테스트에는 특정 작업을 모의하여 특정 작업을 분리하고 테스트하는 경우가 많습니다. 시나리오. 그러한 작업 중 하나는 요청 쿼리 문자열 매개 변수를 지정된 구조체에 바인딩하는 c.BindQuery입니다.
GetMaterialByFilter를 테스트할 때 잘못된 메모리 액세스 또는 nil 포인터 역참조와 관련된 오류로 인해 테스트가 실패합니다. 이 오류는 c.BindQuery가 유효한 HTTP 요청으로 제대로 초기화되지 않았기 때문에 발생합니다.
c.BindQuery를 모의하려면 http.Request를 생성하고 해당 URL 및 URL.RawQuery 필드를 설정하세요. 이를 통해 핸들러 함수가 수신하는 요청을 시뮬레이션할 수 있습니다.
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{/* ... */} 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. 이 호출을 테스트하려면 핸들러 함수 서명을 통해 또는 Gin 컨텍스트 값으로 설정하여 서비스를 주입할 수 있어야 합니다.
서비스가 인터페이스인 경우 c.Set 메서드를 사용하여 주입할 수 있습니다. :
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) }
필요한 인터페이스를 구현하고 이를 서비스 컨텍스트로 설정하여 단위 테스트에서 서비스를 모의합니다. value:
type mockSvc struct {} func (mockSvc) GetMaterialByFilter(*weldprogs.QueryParam) (*materialByFilter, error) { /* ... */} func TestGetMaterialByFilter(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Set("svc_context_key", &mockSvc{}) GetMaterialByFilter(c) // ... }
이러한 단계를 수행하면 c.BindQuery와 서비스 호출을 모두 효과적으로 모의하여 Gin 처리기 기능을 격리하고 철저하게 테스트할 수 있습니다.
위 내용은 Gin 핸들러 함수 단위 테스트에서 'c.BindQuery' 및 서비스 호출을 효과적으로 모의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!