Golang тестирует REST API на основе джина, не получая параметры при использовании net/http/httptest

Я разрабатываю REST API на основе Gin golang, конечная точка выглядит примерно так:

func carsByType(c *gin.Context) {
    fmt.Println("Go Request in Handler...")
    carType := c.Params.ByName("type")
    fmt.Println(carType)
    if carType != "" {

    }
    c.JSON(http.StatusBadRequest, gin.H{"result": "Bad request"})
    return
}

func main() {
    router := gin.Default()
    router.GET("/cars/:type", carsByType)
    router.Run(":80")
}

Когда я делаю запрос к конечной точке через браузер и cURL, он просто работает нормально, получая значение carType, но когда я запускаю тесты, он возвращает неверный запрос и получает carType "".

Для тестирования конечной точки мой тестовый код выглядит так:

func TestGetcarsByType(t *testing.T) {
    gin.SetMode(gin.TestMode)
    handler := carsByType
    router := gin.Default()
    router.GET("/cars/1", handler)

    req, err := http.NewRequest("GET", "/cars/1", nil)
    if err != nil {
        fmt.Println(err)
    }
    resp := httptest.NewRecorder()
    router.ServeHTTP(resp, req)
    assert.Equal(t, resp.Code, 200)
}

Что я делаю не так?


person Alex Benz    schedule 14.03.2016    source источник
comment
router.GET("/cars/1", handler) должно быть router.GET("/cars/:type", handler) в вашем тесте.   -  person elithrar    schedule 14.03.2016


Ответы (1)


router.GET("/cars/1", handler) должно быть router.GET("/cars/:type", handler) в вашем тесте.

Обратите внимание, что лучше (более проверяемый, меньше дублирования маршрутов) было бы создать функцию SetupRouter() *gin.Engine, которая возвращает все ваши маршруты. например

// package main

// server.go
// This is where you create a gin.Default() and add routes to it
func SetupRouter() *gin.Engine {
    router := gin.Default()
    router.GET("/cars/:type", carsByType)

    return router
}

func main() {
    router := SetupRouter() 
    router.Run()
}

// router_test.go
testRouter := SetupRouter()

req, err := http.NewRequest("GET", "/cars/1", nil)
if err != nil {
    fmt.Println(err)
}

resp := httptest.NewRecorder()
testRouter.ServeHTTP(resp, req)
assert.Equal(t, resp.Code, 200)
person elithrar    schedule 14.03.2016