Go 언어로 웹 애플리케이션을 작성할 때 우리는 종종 gin 프레임워크를 사용하여 HTTP 요청과 응답을 처리합니다. 단위 테스트를 수행할 때 코드의 품질과 안정성을 보장하기 위해 코드에 대한 커버리지 테스트를 수행해야 합니다. 그러나 gin의 Context.Redirect 메서드에 대한 단위 테스트는 GET 요청을 처리할 때 잘 작동하지만 POST 요청을 처리할 때는 잘 작동하지 않습니다. 이 기사에서 Apple PHP 편집기는 이 문제가 발생하는 이유를 자세히 설명하고 POST 요청 단위 테스트에 대한 몇 가지 솔루션을 제공합니다.
내 서버가 특정 엔드포인트를 다른 서버로 리디렉션하도록 하고 싶습니다. 이 엔드포인트는 리디렉션을 올바르게 따르기 위해 get
ted 或 post
ed。在这两种情况下,http 响应代码都应为 302。如果我在此代码上使用 curl
,它确实在两种情况下都显示响应代码 302,并且 curl -l
일 수 있습니다. 우와.
하지만
내 단위 테스트에서는 httptest.newrecorder()
来捕获信息,但它仅适用于get
,不适用于post
。因此,当我知道实际的重定向正在工作时,我需要弄清楚如何让单元测试工作。失败测试显示http响应代码是200而不是302(http.statusfound
)을 사용합니다.
이것은 독립적인 테스트입니다.
으아아아실제 애플리케이션(표시되지 않음)에서 컬 포스트를 실행하면 작동하는 것을 볼 수 있습니다.
$ go run foo.go post code 200 get code 302
해결책은 context.redirect
之后显式调用 context.writer.writeheadernow
에 있습니다.
이것은 gin.createtestcontext
에서 반환된 gin 컨텍스트를 사용하는 극단적인 경우입니다.
get 요청의 경우 gin은 결국 http.redirect
,它将向响应写入一个简短的 html 正文(类似于 <a href="http://foobar.com">found</a>
)을 호출하여 응답의 상태 코드가 기록됩니다.
게시물 요청의 경우 http.redirect
짧은 html 본문이 작성되지 않으며 응답에 상태 코드가 작성될 기회가 없습니다.
http.redirect의 구현을 참조하세요. 소스 코드에 따르면 content-type
헤더가 이전에 설정된 경우 get 요청에서도 동일한 문제가 발생합니다.
해결책은 context.writer.writeheadernow
:
gin 자체도 동일한 해결 방법을 사용합니다. 상대 경로를 사용하여 테스트 컨텍스트 렌더링 리디렉션을 참조하세요.
실제 서버 애플리케이션은 (*engine).handlehttprequest
将为我们调用 writeheadernow
(소스 코드 참조)와 같은 문제를 겪지 않습니다. 그래서 나는 이것을 "버그"라기보다는 "에지 케이스"라고 부릅니다.
위 내용은 gin의 Context.Redirect에 대한 단위 테스트는 GET 응답 코드에서는 작동하지만 POST 응답 코드(golang)에서는 작동하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!