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

在遵循他们的教程之后,我正在尝试在 Go 中构建和测试一个非常基本的 API,以了解有关该语言的更多信息。API 和定义的四个路由在 Postman 和浏览器中工作,但是当尝试为任何路由编写测试时,ResponseRecorder 没有正文,因此我无法验证它是否正确。


我按照此处的示例进行操作,它可以工作,但是当我为我的路线更改它时,没有响应。


这是我的main.go文件。


package main


import (

    "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)

}


我很感激我可能犯了一个初学者的错误,所以请怜悯我。我已经阅读了许多测试多路复用器的博客,但看不出我做错了什么。


提前感谢您的指导。


千万里不及你
浏览 142回答 1
1回答

慕尼黑8549860

我认为这是因为您的测试不包括路由器,因此未检测到路径变量。来,试试这个 // 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() }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go