HTTP 요청 중에 JSON 데이터를 구조체에 바인딩하는 것은 웹 애플리케이션에서 일반적인 작업입니다. . 요청 컨텍스트를 조롱해야 하는 테스트 프레임워크를 활용하는 것은 어려울 수 있습니다. 특히, gin.Context를 조롱하면 BindJSON 메서드에 의존하는 함수를 테스트하려고 할 때 어려움이 발생합니다. 이 기사는 이 문제에 대한 포괄적인 해결책을 제공합니다.
먼저, 테스트 gin.Context를 인스턴스화하고 해당 http.Request를 null이 아닌 것으로 설정하는 것이 중요합니다.
w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Request = &http.Request{ Header: make(http.Header), }
다음으로, 다음을 사용하여 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.Context의 BindJSON을 효과적으로 모의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!