>백엔드 개발 >Golang >모의를 사용하여 진 처리기 기능을 효과적으로 단위 테스트하는 방법은 무엇입니까?

모의를 사용하여 진 처리기 기능을 효과적으로 단위 테스트하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-17 20:31:12814검색

How to Effectively Unit Test Gin Handler Functions with Mocks?

단위 테스트 Gin 핸들러 함수에 대한 모의

c.BindQuery 기능 테스트

Gin에서 HTTP 요청과 관련된 작업을 테스트하려면 *http를 초기화합니다. .Gin 컨텍스트를 요청하고 설정합니다. 특히 c.BindQuery 테스트를 위해 요청의 URL 및 URL.RawQuery를 초기화합니다.

import (
    "net/http/httptest"

    "github.com/gin-gonic/gin"
)

func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

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

    // Test query
    testQuery := weldprogs.QueryParam{/* init fields */}

    q := req.URL.Query()
    for _, s := range testQuery.Basematgroup_id {
        q.Add("basematgroup_id", s)
    }

    // Set URL.RawQuery
    req.URL.RawQuery = q.Encode()

    // Set request to Gin context
    c.Request = req

    return c, w
}

JSON 바인딩 모의

JSON 바인딩 모의에 대한 지침은 이 리소스를 참조하세요.

테스트 서비스

다음과 같은 서비스 services.WeldprogService.GetMaterialByFilter(&queryParam)는 있는 그대로 테스트할 수 없습니다. 테스트 가능하게 하려면:

  • 인터페이스로 변환합니다.
  • 이를 핸들러에 종속성으로 삽입합니다.
  • Gin 컨텍스트 값으로 설정합니다.

인터페이스 및 컨텍스트 값 접근 방식:

type services interface {
    GetMaterialByFilter(*weldprogs.QueryParam) (*weldprogs.MaterialByFilter, error)
}

func mockWeldprogService(service services) {
    return func(c *gin.Context) {
        c.Set("svc_context_key", service)
    }
}

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

    c.Use(mockWeldprogService(&mockSvc{}))

    GetMaterialByFilter(c)

    // ...
}

위 내용은 모의를 사용하여 진 처리기 기능을 효과적으로 단위 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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