我正在用golang编写HTTP处理程序的单元测试。在查看代码覆盖率报告时,我遇到了以下问题:从请求中读取请求正文时,ioutil.ReadAll
可能会返回我需要处理的错误。但是,当我为我的处理程序编写单元测试时,我不知道如何以触发该错误的方式将请求发送到我的处理程序(内容的结尾过早似乎不会产生这样的错误,但是会在解体身体)。这就是我想要做的:
package demo
import (
"bytes"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func HandlePostRequest(w http.ResponseWriter, r *http.Request) {
body, bytesErr := ioutil.ReadAll(r.Body)
if bytesErr != nil {
// intricate logic goes here, how can i test it?
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
defer r.Body.Close()
// continue...
}
func TestHandlePostRequest(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(HandlePostRequest))
data, _ := ioutil.ReadFile("testdata/fixture.html" target="_blank">json")
res, err := http.Post(ts.URL, "application/json", bytes.NewReader(data))
// continue...
}
我HandlePostRequest
该如何为bytesErr
不存在的情况编写测试用例nil
?
您可以创建和使用http.Request
伪造的伪造品,在读取其主体时会故意返回错误。您不一定需要一个全新的请求,有缺陷的主体就足够了(这是一个io.ReadCloser
)。
使用此httptest.NewRequest()
函数可以实现最简单的方法,在该函数中您可以传递io.Reader
将用作io.ReadCloser
请求正文的值(包装为)。
这是一个示例io.Reader
,尝试从中读取错误时故意返回错误:
type errReader int
func (errReader) Read(p []byte) (n int, err error) {
return 0, errors.New("test error")
}
涵盖您的错误情况的示例:
func HandlePostRequest(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Printf("Error reading the body: %v\n", err)
return
}
fmt.Printf("No error, body: %s\n", body)
}
func main() {
testRequest := httptest.NewRequest(http.MethodPost, "/something", errReader(0))
HandlePostRequest(nil, testRequest)
}
输出(在Go Playground上尝试):
Error reading the body: test error
问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。
问题内容: 我正在尝试解析方法的某些参数,从请求正文中提取值并进行验证,然后将其注入某些带注释的参数中。 最大的问题是我发现(get from )不能 多次 读取输入流(某些参数在请求正文中)。那么,如何才能多次检索/ 或请求正文? 问题答案: 您可以添加过滤器,拦截当前过滤器并将其包装在custom中。在您的custom中,您将读取请求主体并将其缓存,然后实现并从缓存的值中读取。由于包装请求后,
我试图解析方法的某些特定参数,从请求体中提取值并验证它们,然后将它们注入特定的带注释的参数中。 最大的问题是,我发现(从)读取输入流(某些参数在请求正文中)的次数不能超过一次。那么,如何多次检索/或请求正文?
如何在reactor netty服务器中读取请求正文?我想让请求主体确定响应的内容,但在示例代码中找不到这样的示例。 例外 block()/blockFirst()/blockLast()正在阻塞,这在线程reactor-http-nio-2中不受支持 调用者 卷曲http://127.0.0.1:45441/test1/test-d“12312321312”-i-H“内容类型:应用程序/json
问题内容: 我已经在go中编写了http客户端包装,我需要对其进行彻底的测试。我正在使用包装器中的ioutil.ReadAll阅读响应正文。我在弄清楚如何才能借助httptest强制从响应正文读取失败时遇到了一些麻烦。 我假设我可以像这样设置一个假服务器: 我假设我需要修改ResposeWriter。现在,有什么办法让我修改responseWriter,从而迫使包装器中的ioutil.ReadAl
问题内容: type ValidationModel struct { Name string Email string Password string } 首先,我使用govalidator验证请求正文。 在验证了请求之后,我再次将请求主体解码为用户结构,但已使用validationModel读取了请求主体一次,因此当我尝试再次将其解码为用户时,它没有提供任何值。 我在这里可以想到两种解决方案: