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

无法为 gin web 框架 golang 编写单元测试

无法为 gin web 框架 golang 编写单元测试

Go
宝慕林4294392 2022-06-27 10:01:08
我写了下面的代码来测试一个函数func TestServe(t *testing.T) {        config.SetLoggerConfig("logger.apipath")        router := Serve()        w := httptest.NewRecorder()        req, _ := http.NewRequest("GET", "/nodes", nil)        router.ServeHTTP(w, req)        assert.Equal(t, 200, w.Code)}这里 Server() 在我运行它时返回一个杜松子酒引擎,代码卡在[GIN-debug] 在 :8080 上监听和服务 HTTP如何解决这个问题?我已经修改了代码,但它仍然挂在下面是片段server.go 片段func Serve() *gin.Engine {        logger.Log.Info("Serve()")        r := gin.Default()        r.GET("/ping", func(c *gin.Context) {                c.JSON(200, gin.H{                        "message": "pong",                })        })        r.Use(ginzap.Ginzap(logger.Log, time.RFC3339, false))        r.Use(ginzap.RecoveryWithZap(logger.Log, true))        r.GET("/nodes", listNodes)        r.POST("/uuid", getUUID)        r.GET("/hwstatus/:node_id", getNodeHWStatus)        r.PUT("/hwstatus/:node_id", updateNodeHWStatus)        node := r.Group("/node")        {                node.POST("/", createNode)                node.GET("/:node_id", describeNode)                node.PUT("/:node_id", updateNode)                node.DELETE("/:node_id", deleteNode)                node.POST("/deploy/:node_id", deployNode)        }        if err := r.Run(":8080"); err != nil {                logger.Log.Fatal("Failed to Run Server", zap.Error(err))                //log.Fatalf("Failed to Run server: %v ", err)        }        return r}testing.go 片段如下func TestDescribeNode(t *testing.T) {        config.SetLoggerConfig("logger.apipath")        ts := httptest.NewServer(Serve())        defer ts.Close()        resp, err := http.Get(fmt.Sprintf("%s/node/12334", ts.URL))       if err != nil {        t.Fatalf("Expected no error, got %v", err)    }    if resp.StatusCode != 200 {        t.Fatalf("Expected status code 200, got %v", resp.StatusCode)    }
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

(您从中调用的Run)确实将路由器附加到 a并开始侦听和服务 HTTP 请求。它是. 除非发生错误,否则它会无限期地阻止调用者。r.Run(":8080")Serve()http.Serverhttp.ListenAndServe(addr, router)


如果你想用这样的方式创建测试服务器,你必须r.Run(":8080")从中取出。例如,您可以像这样修改代码:Serve()Serve()httptest.NewServer(Serve())


func Serve() *gin.Engine {

    logger.Log.Info("Serve()")


    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {

        c.JSON(200, gin.H{

            "message": "pong",

        })

    })

    r.Use(ginzap.Ginzap(logger.Log, time.RFC3339, false))

    r.Use(ginzap.RecoveryWithZap(logger.Log, true))


    r.GET("/nodes", listNodes)

    r.POST("/uuid", getUUID)

    r.GET("/hwstatus/:node_id", getNodeHWStatus)

    r.PUT("/hwstatus/:node_id", updateNodeHWStatus)

    node := r.Group("/node")

    {

        node.POST("/", createNode)

        node.GET("/:node_id", describeNode)

        node.PUT("/:node_id", updateNode)

        node.DELETE("/:node_id", deleteNode)

        node.POST("/deploy/:node_id", deployNode)

    }

    return r

}


func Start() {

    if err := Serve().Run(":8080"); err != nil {

        logger.Log.Fatal("Failed to Run Server", zap.Error(err))

        //log.Fatalf("Failed to Run server: %v ", err)

    }

}


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号