如何测试HTTP请求处理程序

7

我有一组请求处理程序,如下所示:

func GetProductsHandler(w http.ResponseWriter, req *http.Request) {
    defer req.Body.Close()
    products := db.GetProducts()

    //    ...
    // return products as JSON array
}

如何正确测试它们?我应该发送假的ResponseWriter和Request对象到函数中,并查看结果吗?

在Go中是否有工具可以模拟请求和响应对象,简化测试过程,而不必在测试前启动服务器?


3
你是指httptest吗? - JimB
https://golang.org/pkg/net/http/httptest/#example_ResponseRecorder - dm03514
1个回答

8

Go提供了一个模拟的写入器,用于测试处理程序。标准库文档提供了一个示例:(链接)

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    handler := func(w http.ResponseWriter, r *http.Request) {
        http.Error(w, "something failed", http.StatusInternalServerError)
    }

    req := httptest.NewRequest("GET", "http://example.com/foo", nil)
    w := httptest.NewRecorder()
    handler(w, req)

    fmt.Printf("%d - %s", w.Code, w.Body.String())
}

我认为在单元测试中,全局依赖(db)会给测试带来麻烦。使用go语言,你的测试可以重新分配一个值,掩盖db的全局值。

另一种策略(我更喜欢)是将处理程序打包到一个结构体中,该结构体具有一个db属性。

type Handlers struct {
  db DB_INTERFACE
}

func (hs *Handlers) GetProductsHandler(w http.ResponseWriter, req *http.Request) {...}

这样,您的测试可以使用一个存根(stub)db对象来实例化Handlers,从而让您创建无需IO的单元测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接