> 백엔드 개발 > Golang > Go 테스트를 위해 gin.Context의 BindJSON을 효과적으로 모의하는 방법은 무엇입니까?

Go 테스트를 위해 gin.Context의 BindJSON을 효과적으로 모의하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-06 19:22:12
원래의
300명이 탐색했습니다.

How to Effectively Mock gin.Context's BindJSON for Go Testing?

Go에서 BindJSON에 대한 Mock gin.Context 설정

소개

HTTP 요청 중에 JSON 데이터를 구조체에 바인딩하는 것은 웹 애플리케이션에서 일반적인 작업입니다. . 요청 컨텍스트를 조롱해야 하는 테스트 프레임워크를 활용하는 것은 어려울 수 있습니다. 특히, gin.Context를 조롱하면 BindJSON 메서드에 의존하는 함수를 테스트하려고 할 때 어려움이 발생합니다. 이 기사는 이 문제에 대한 포괄적인 해결책을 제공합니다.

gin.Context 조롱

먼저, 테스트 gin.Context를 인스턴스화하고 해당 http.Request를 null이 아닌 것으로 설정하는 것이 중요합니다.

    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w) 

    c.Request = &http.Request{
        Header: make(http.Header),
    }
로그인 후 복사

POST JSON 본문 모의

다음으로, 다음을 사용하여 POST JSON 본문을 모의할 수 있습니다. 함수:

func MockJsonPost(c *gin.Context /* the test context */, content interface{}) {
    c.Request.Method = "POST" // or PUT
    c.Request.Header.Set("Content-Type", "application/json")

    jsonbytes, err := json.Marshal(content)
    if err != nil {
        panic(err)
    }
    
    // the request body must be an io.ReadCloser
    // the bytes buffer though doesn't implement io.Closer,
    // so you wrap it in a no-op closer
    c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonbytes))
}
로그인 후 복사

이 함수는 json.Marshal()을 사용하여 JSON으로 마샬링될 수 있는 콘텐츠 인터페이스{} 매개변수를 허용합니다. 이는 적절한 JSON 태그 또는 map[string]인터페이스{}가 있는 구조체일 수 있습니다.

사용 예시

다음은 테스트에서 MockJsonPost 함수를 사용하는 방법입니다.

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

    ctx.Request = &http.Request{
        Header: make(http.Header),
    }


    MockJsonPost(ctx, map[string]interface{}{"foo": "bar"})
    
    MyHandler(ctx)
    assert.EqualValues(t, http.StatusOK, w.Code)
} 
로그인 후 복사

추가 참고 사항

Gin 핸들러 테스트에 대한 자세한 내용은 다음을 참조하세요. 리소스:

  • Go Gin 핸들러 기능을 단위 테스트하는 방법은 무엇입니까?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿