Как проверить основную функцию в приложении джина?

Как я могу проверить func main? Как это:

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

В нем только 2 строки, но я бы хотел, чтобы они были покрыты. TestMain' зарезервировано для подготовки к тестированию, означает ли это тестирование main не было запланировано создателями языка? Я могу переместить содержимое в другую функцию mainReal но, похоже, что-то более инженерное?

Как проверить джин начал хорошо? Можно запустить main в отдельной программе проверьте ответ и остановите его?

Благодарю.

PS Возможный дубликат не является точным дубликатом, потому что он предназначен не для тестирования функции main() сама по себе, а скорее идеи для перемещения на улицу и так содержит в себе другую проблему и подход.

1 ответ

Решение

Решение.

Вы можете проверить функцию main() из пакета main так же, только не называйте это TestMain, Я запускаю его как отдельную программу, затем пытаюсь подключиться к нему и выполнить любой запрос.

Я решил подключиться к вспомогательному обработчику, который должен ответить простым 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")
}
Другие вопросы по тегам