使用路径变量测试回显处理程序

mar*_*ins 3 testing go

我\xe2\x80\x99m 测试我的一个http 处理程序。\n像这样的curl 可以工作:curl localhost:8080/v1/parts/2bb834c9-8e17-4e2c-80b9-a20b80732899。\n但是相应的测试失败,因为处理程序无法从URL 中提取id。

\n

请看一下这个测试文件。我不\xe2\x80\x99不明白为什么我的curl命令有效但第17行的newRequest失败。

\n
  1 package part\n  2\n  3 import (\n  4         "net/http"\n  5         "net/http/httptest"\n  6         "testing"\n  7\n  8         "github.com/labstack/echo/v4"\n  9         "github.com/stretchr/testify/assert"\n 10 )\n 11\n 12 var handler *Handler\n 13\n 14 func TestGetPart(t *testing.T) {\n 15         e := echo.New()\n 16\n 17         req := httptest.NewRequest("GET", "/v1/parts/2bb834c9-8e17-4e2c-80b9-a20b80732899", nil)\n 18         rec := httptest.NewRecorder()\n 19         c := e.NewContext(req, rec)\n 20\n 21         if assert.NoError(t, handler.handleGetPart(c)) {\n 22                 assert.Equal(t, http.StatusOK, rec.Code)\n 23         }\n 24 }\n\n
Run Code Online (Sandbox Code Playgroud)\n

去测试 -v ./internal/handler/part

\n
=== RUN   TestGetPart\n2020/09/08 08:51:10 UUID PASSED:\ntime="2020-09-08T08:51:10+02:00" level=error msg="Could not decode string to uuid"\n    TestGetPart: handler_test.go:21:\n                Error Trace:    handler_test.go:21\n                Error:          Received unexpected error:\n                                invalid UUID length: 0\n                Test:           TestGetPart\n--- FAIL: TestGetPart (0.00s)\n
Run Code Online (Sandbox Code Playgroud)\n

处理程序

\n
        ID := ctx.Param("id")\n        log.Println("UUID PASSED: ", ID)\n        uuid, err := uuid.Parse(ID)\n        if err != nil {\n                logrus.Error("Could not decode string to uuid")\n                return err\n        }\n\n        // Fetch data.json from S3 bucket\n        filename := helper.PartFileName(uuid)\n        content, err := a.GetObject(filename)\n        if err != nil {\n                logrus.Error(err)\n                return ctx.JSON(http.StatusNotFound, "file not found")\n\n        }\n        return ctx.String(http.StatusOK, content)\n} \n\n
Run Code Online (Sandbox Code Playgroud)\n

任何我的路线:

\n
func Register(router *echo.Echo, handler *Handler) {\n        router.GET("/v1/parts/:id", handler.handleGetPart)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Зел*_*ный 9

您应该这样设置路径:

e := echo.New()
req := httptest.NewRequest("GET", "/", nil)
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)

c.SetPath("/:id")
c.SetParamNames("id")
c.SetParamValues("2bb834c9-8e17-4e2c-80b9-a20b80732899")
// rest of the test goes below
Run Code Online (Sandbox Code Playgroud)