Задать вопрос
@SSSSTTTTAAAASSSS

Не получается протестить handler используя *gin.Gonic?

Всем добрый день.
Есть проект на go в котором используется gin-gonic. Для handler-в требуется написать тесты.
Всю структуру не буду описывать, т.к. думаю она не нужна, но проблема в том что роутер создается и сразу же запускает сервер.
пакет роутера router:
type Router struct {
	serverPort *config.HTTPServerConfiguration
	handler    handler.Handler
}

func New(httpPort *config.HTTPServerConfiguration, event handler.Handler) *Router {
	return &Router{
		serverPort: httpPort,
		handler:    event,
	}
}

func (r *Router) RunServer(ctx context.Context) {
	engine := gin.Default()
	r.assignRoutes(engine)

	srv := &http.Server{
		Addr:    r.serverPort.HTTPPort,
		Handler: engine,
	}

	go func() {
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()

	<-ctx.Done()

	log.Println("shutting down gracefully, press Ctrl+C again to force")

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server forced to shutdown: ", err)
	}

	log.Println("Server exiting")
}

func (r *Router) assignRoutes(engine *gin.Engine) {
	engine.GET("/bucket", r.handler.ProductsInBucket)
	engine.GET("/outofbucket", r.handler.ProductsOutFromBucket)
	engine.GET("/description", r.handler.ProductsDescription)
	engine.GET("/descriptionandbucket", r.handler.ProductsBucketAndDescription)
}

Handler-ы находятся в другом пакете.
И вот вопросом в том, требуется ли мне дополнительная функция, которая бы возвращала *gin.Engine, чтобы я мог в тестововм файле запускать спокойно сервер, или мне надо решать тут вопрос по-другому?
Заранее спасибо за ответы.

П.С.: если надо какая-то дополнительная информацию прошу сообщить.
  • Вопрос задан
  • 166 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@12rbah
Handler-ы находятся в другом пакете.
Тестировать можно в том же пакете, но в целом это не важно, если только вы не делаете их приватными.

И вот вопросом в том, требуется ли мне дополнительная функция, которая бы возвращала *gin.Engine, чтобы я мог в тестововм файле запускать спокойно сервер

Нет не нужна. тут есть пример

Для простых случаев получится примерно так
func testHTTPResponse(t *testing.T, r *gin.Engine, req *http.Request, f func(w *httptest.ResponseRecorder) bool) {

	w := httptest.NewRecorder()

	r.ServeHTTP(w, req)

	if !f(w) {
		t.Fail()
	}
}

func TestApiHandler(t *testing.T) {

	var a apiService
	router := gin.Default()
	router.GET("/api/login",a.SignIn)
	req, err := http.NewRequest("GET", "/test", nil)
	if err != nil {
		t.Fatal(err)
	}
	testHTTPResponse(t, router, req, func(w *httptest.ResponseRecorder) bool {
		statusOK := w.Code == http.StatusOK

		p, err := ioutil.ReadAll(w.Body)
		pageOK := err == nil && strings.Index(string(p), "<title>Register</title>") > 0
		return statusOK && pageOK
	})

}

p.s. для случаев с аутентификацией/всякими токенами, тестировать будет труднее
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы