如何测试杜松子酒应用程序中的主要功能?

How to test main function in gin application?

如何测试 func main?像这样:

func main(){
     Engine := GetEngine() // returns gin router with handlers atttached 
     Engine.Run(":8080")
}

它只有 2 行,但我想将它们包含在内。 TestMain' 是为测试准备保留的,这是否意味着测试 main 不是语言创建者计划的? 我可以将内容移动到另一个函数 mainReal 但它似乎有些过度工程?

如何测试gin启动好?我可以在单独的 goroutine 中启动 main,检查回复并停止它吗?

谢谢。

P.S。可能的重复不是精确的重复,因为它不是致力于测试 func main() 本身,而是致力于向外移动的想法,因此包含不同的问题和方法。

解决方案。

您可以用同样的方法测试包 main 中的函数 main(),只是不要将其命名为 TestMain。我将它作为一个单独的 goroutine 启动,然后尝试连接到它并执行任何请求。

我决定连接到辅助处理程序,它应该以简单的 json {"status": "ok"} 响应。 就我而言:

func TestMainExecution(t *testing.T) {
    go main()
    resp, err := http.Get("http://127.0.0.1:8080/checkHealth") 
    if err != nil {
            t.Fatalf("Cannot make get: %v\n", err)
    }
    bodySb, err := ioutil.ReadAll(resp.Body)
    if err != nil {
            t.Fatalf("Error reading body: %v\n", err)
    }
    body := string(bodySb)
    fmt.Printf("Body: %v\n", body)
    var decodedResponse interface{}
    err = json.Unmarshal(bodySb, &decodedResponse)
    if err != nil {
            t.Fatalf("Cannot decode response <%p> from server. Err: %v", bodySb, err)
    }
    assert.Equal(t, map[string]interface{}{"status": "ok"}, decodedResponse,
            "Should return status:ok")
}