我有类似下面的一组请求处理程序:如何测试Golang中的http请求处理程序?

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

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

如何测试他们以正确的方式?我应该将模拟的ResponseWriter和Request对象发送给函数并查看结果吗?

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

Sergei Basharov

你的意思是['httptest' package](https://golang.org/pkg/net/http/httptest/)? –

'http.Request'和'http.Response'都是简单的和“完全导出”的类型,所以只需将它们设置为任何你想要或需要的。不需要工具或“嘲笑”。 –

https://golang.org/pkg/net/http/httptest/#example_ResponseRecorder –

回答

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()) 
} 
dbdb
db
type Handlers struct { 
    db DB_INTERFACE 
} 

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

dm03514

答案中提到的“标准库文档”可以在这里找到:https://golang.org/pkg/net/http/ httptest / –