Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何测试从请求主体读取时的错误?_Unit Testing_Http_Go_Error Handling - Fatal编程技术网

Unit testing 如何测试从请求主体读取时的错误?

Unit testing 如何测试从请求主体读取时的错误?,unit-testing,http,go,error-handling,Unit Testing,Http,Go,Error Handling,我正在为golang中的http处理程序编写单元测试。在查看此问题的代码覆盖率报告时,我遇到了以下问题:从请求读取请求正文时,ioutil.ReadAll可能会返回我需要处理的错误。然而,当我为我的处理程序编写单元测试时,我不知道如何向我的处理程序发送一个会触发这样一个错误的请求(内容过早结束似乎不会生成这样一个错误,但会在对主体进行解组时生成一个错误)。这就是我想做的: package demo import ( "bytes" "io/ioutil" "net/ht

我正在为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.json")
    res, err := http.Post(ts.URL, "application/json", bytes.NewReader(data))
    // continue...
}
如何为
HandlePostRequest
编写一个测试用例,该测试用例还包括
bytesErr
不是
nil
的情况?

您可以创建并使用一个伪造的,它在读取其主体时故意返回错误。你不一定需要一个全新的请求,一个有缺陷的身体就足够了(这是一个错误)

最简单的方法是使用函数传递一个值,该值将用作请求正文(包装为
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)
}
输出(在上尝试):


如果您需要模拟响应主体(而不是请求主体)的错误读取,请参阅相关问题:

很好的答案,这正是我想要的。return语句存在于我的真实代码中,但是感谢您以任何方式声明它,我将把它添加到问题中以避免其他人混淆。
Error reading the body: test error