为了账号安全,请及时绑定邮箱和手机立即绑定

为什么运行 mux API 测试时响应体为空?

为什么运行 mux API 测试时响应体为空?

Go
千万里不及你 2022-07-18 15:44:35
在遵循他们的教程之后,我正在尝试在 Go 中构建和测试一个非常基本的 API,以了解有关该语言的更多信息。API 和定义的四个路由在 Postman 和浏览器中工作,但是当尝试为任何路由编写测试时,ResponseRecorder 没有正文,因此我无法验证它是否正确。我按照此处的示例进行操作,它可以工作,但是当我为我的路线更改它时,没有响应。这是我的main.go文件。package mainimport (    "encoding/json"    "fmt"    "log"    "net/http"    "github.com/gorilla/mux")// A Person represents a user.type Person struct {    ID        string    `json:"id,omitempty"`    Firstname string    `json:"firstname,omitempty"`    Lastname  string    `json:"lastname,omitempty"`    Location  *Location `json:"location,omitempty"`}// A Location represents a Person's location.type Location struct {    City    string `json:"city,omitempty"`    Country string `json:"country,omitempty"`}var people []Person// GetPersonEndpoint returns an individual from the database.func GetPersonEndpoint(w http.ResponseWriter, req *http.Request) {    w.Header().Set("Content-Type", "application/json")    params := mux.Vars(req)    for _, item := range people {        if item.ID == params["id"] {            json.NewEncoder(w).Encode(item)            return        }    }    json.NewEncoder(w).Encode(&Person{})}// GetPeopleEndpoint returns all people from the database.func GetPeopleEndpoint(w http.ResponseWriter, req *http.Request) {    w.Header().Set("Content-Type", "application/json")    json.NewEncoder(w).Encode(people)}// CreatePersonEndpoint creates a new person in the database.func CreatePersonEndpoint(w http.ResponseWriter, req *http.Request) {    w.Header().Set("Content-Type", "application/json")    params := mux.Vars(req)    var person Person    _ = json.NewDecoder(req.Body).Decode(&person)    person.ID = params["id"]    people = append(people, person)    json.NewEncoder(w).Encode(people)}我很感激我可能犯了一个初学者的错误,所以请怜悯我。我已经阅读了许多测试多路复用器的博客,但看不出我做错了什么。提前感谢您的指导。
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

我认为这是因为您的测试不包括路由器,因此未检测到路径变量。来,试试这个


 // main.go

 func router() *mux.Router {

    router := mux.NewRouter()

    router.HandleFunc("/people", GetPeopleEndpoint).Methods("GET")

    router.HandleFunc("/people/{id}", GetPersonEndpoint).Methods("GET")

    router.HandleFunc("/people/{id}", CreatePersonEndpoint).Methods("POST")

    router.HandleFunc("/people/{id}", DeletePersonEndpoint).Methods("DELETE")

    return router

 }

并在您的测试用例中,从路由器方法启动,如下所示


 handler := router()

 // Our handlers satisfy http.Handler, so we can call their ServeHTTP method

 // directly and pass in our Request and ResponseRecorder.

 handler.ServeHTTP(rr, req)

现在,如果您尝试访问路径变量 id,它应该出现在 mux 返回的映射中,因为当您从 router() 返回的 mux 路由器实例初始化处理程序时,mux 注册了它


 params := mux.Vars(req)

 for index, item := range people {

    if item.ID == params["id"] {

        people = append(people[:index], people[index+1:]...)

        break

    }

 }

也像您提到的那样,使用 init 函数进行一次设置。


 // main.go

 func init(){

    SeedData()

 }


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信