登录
首页 >  Golang >  Go问答

单元测试:在 Golang 中如何测试使用 http.ResponseWriter 和 http.Request

来源:stackoverflow

时间:2024-03-24 11:27:44 132浏览 收藏

单元测试 Golang 中使用 `http.ResponseWriter` 和 `http.Request` 的函数时,需要创建一个 HTTP 请求。首先,使用 `http.NewRequest()` 创建一个请求,指定方法、端点和请求正文(使用字节流)。接下来,使用 `httptest.NewRecorder()` 启动一个响应记录器并定义一个处理程序。最后,使用 `ServeHTTP()` 方法将请求传递给处理程序,并使用 `assert` 包检查响应是否符合预期。

问题内容

我刚刚开始学习 golang 和 postgresql。现在,我尝试对 createtodo 函数进行单元测试。 我的 createtodo 函数是

func createtodo(w http.responsewriter, r *http.request) {
    createtodo := &models.todo{}
    utils.parsebody(r, createtodo)
    createtodolist := createtodo.createtodo()
    res, _ := json.marshal(createtodolist)
    w.writeheader(http.statusok)
    w.write(res)
}

我尝试为这个函数进行单元测试...到目前为止我写了一些代码,例如

func testcreatetodo(t *testing.t) {
    dbdata := &models.todo{
        title: "test-title-console-check",
        description: "test-description-console-check",
        condition: true,
    }

    utils.parsebody(r, dbdata) // r should be r *http.request

    submittedtodo := dbdata.createtodo()
    res, _ := json.marshal(submittedtodo)
    r.writeheader(http.statusok) // r should be r *http.request
    r.write(res)

    fmt.println("res: ", res)
}

这是utils文件夹中的parsebodu函数

func parsebody(r *http.request, x interface{}) {
    if body, err := ioutil.readall(r.body); err == nil {
        if err := json.unmarshal([]byte(body), x); err != nil {
            return
        }
    }
}

在这里,我在传递 net/http(r *http.request) 时遇到问题。我不知道如何像参数一样传递这个函数...我尝试在 testcreatetodo(t *testing.t, r *http.request) 中接收它,但没有达到我的预期。

有什么方法可以对 createtodo 函数进行单元测试吗?

非常感谢您的帮助!

编辑1]

我尝试创建一个全局变量

var readdata *http.request
var writedata http.responsewriter

并在函数中使用它。我之所以将其设为全局变量,是因为我通常在 等函数中使用它,所以我认为我也可以将其用作全局变量。

所以我将代码编辑为

var readData *http.Request
var writeData http.ResponseWriter

func TestCreateTodo(t *testing.T) {
    // w := httptest.NewRecorder()
    dbData := &models.Todo{
        Title: "test-title-console-check",
        Description: "test-description-console-check",
        Condition: true,
    }

    utils.ParseBody(readData, dbData)

    submittedTodo := dbData.CreateTodo()
    res, _ := json.Marshal(submittedTodo)
    writeData.WriteHeader(http.StatusOK)
    writeData.Write(res)

    fmt.Println("res: ", res)
}

但是我收到了这个错误


正确答案


正如 volker 提到的,您需要创建一个 http 请求。所以你错过了这一行:

req, err := http.newrequest("get", , )

如 go http 包 documentation 所示,正文必须作为字节流传递。您可以使用 bytes.buffer 来实现:

var body bytes.buffer
err := json.newencoder(&body).encode(dbdata)

提出请求后,您需要启动响应记录器并定义处理程序:

res := httptest.NewRecorder()
handler := http.HandlerFunc()
handler.ServeHTTP(res, req)

然后您可以检查 assert 包的响应是否符合预期。

~佐伊~

好了,本文到此结束,带大家了解了《单元测试:在 Golang 中如何测试使用 http.ResponseWriter 和 http.Request 》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>