Как проверить основную функцию в приложении джина?
Как я могу проверить 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")
}