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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB앞으로
2024-02-10 19:27:081425검색

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으로 문의하시기 바랍니다. 삭제