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

时间:2017-07-21 05:51:10

标签: testing go main gin

如何测试func main?像这样:

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

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

如何测试杜松子酒已经开始了吗?我可以在单独的goroutine中启动main,检查回复并停止吗?

感谢。

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

1 个答案:

答案 0 :(得分:0)

解。

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

我决定连接到auxilary处理程序,该处理程序应该使用简单的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")
}