>백엔드 개발 >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.필요에 따라 URL과 헤더를 요청하고 설정합니다.
  3. 요청 쿼리(weldprogs.QueryParam)를 초기화하고 이를 URL.RawQuery로 인코딩합니다.
  4. 요청을 Gin 컨텍스트로 설정합니다. c.Request = 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.