>  기사  >  백엔드 개발  >  gin의 Context.Redirect에 대한 단위 테스트는 GET 응답 코드에서는 작동하지만 POST 응답 코드(golang)에서는 작동하지 않습니다.

gin의 Context.Redirect에 대한 단위 테스트는 GET 응답 코드에서는 작동하지만 POST 응답 코드(golang)에서는 작동하지 않습니다.

WBOY
WBOY앞으로
2024-02-10 19:27:081156검색

gin 的 Context.Redirect 的单元测试适用于 GET 响应代码,但不适用于 POST 响应代码 (golang)

Go 언어로 웹 애플리케이션을 작성할 때 우리는 종종 gin 프레임워크를 사용하여 HTTP 요청과 응답을 처리합니다. 단위 테스트를 수행할 때 코드의 품질과 안정성을 보장하기 위해 코드에 대한 커버리지 테스트를 수행해야 합니다. 그러나 gin의 Context.Redirect 메서드에 대한 단위 테스트는 GET 요청을 처리할 때 잘 작동하지만 POST 요청을 처리할 때는 잘 작동하지 않습니다. 이 기사에서 Apple PHP 편집기는 이 문제가 발생하는 이유를 자세히 설명하고 POST 요청 단위 테스트에 대한 몇 가지 솔루션을 제공합니다.

질문 내용

내 서버가 특정 엔드포인트를 다른 서버로 리디렉션하도록 하고 싶습니다. 이 엔드포인트는 리디렉션을 올바르게 따르기 위해 getted 或 posted。在这两种情况下,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

솔루션

tl;dr

해결책은 context.redirect 之后显式调用 context.writer.writeheadernow에 있습니다.

지침

이것은 gin.createtestcontext에서 반환된 gin 컨텍스트를 사용하는 극단적인 경우입니다.

get 요청의 경우 gin은 결국 http.redirect ,它将向响应写入一个简短的 html 正文(类似于 64ac7c208db62edaa9346a44958f6a3efound5db79b134e9f6b82c0b36e0489ee08ed )을 호출하여 응답의 상태 코드가 기록됩니다.

게시물 요청의 경우 http.redirect 짧은 html 본문이 작성되지 않으며 응답에 상태 코드가 작성될 기회가 없습니다.

http.redirect의 구현을 참조하세요. 소스 코드에 따르면 content-type 헤더가 이전에 설정된 경우 get 요청에서도 동일한 문제가 발생합니다.

으아아아

해결책은 context.writer.writeheadernow:

을 명시적으로 호출하는 것입니다. 으아아아

gin 자체도 동일한 해결 방법을 사용합니다. 상대 경로를 사용하여 테스트 컨텍스트 렌더링 리디렉션을 참조하세요.

실제 서버 애플리케이션은 (*engine).handlehttprequest 将为我们调用 writeheadernow(소스 코드 참조)와 같은 문제를 겪지 않습니다. 그래서 나는 이것을 "버그"라기보다는 "에지 케이스"라고 부릅니다.

위 내용은 gin의 Context.Redirect에 대한 단위 테스트는 GET 응답 코드에서는 작동하지만 POST 응답 코드(golang)에서는 작동하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제