Как установить хост в тестовом контексте джина? - PullRequest
1 голос
/ 10 апреля 2020

Я хотел бы написать модульный тест для контроллера, но я продолжаю получать ошибку во время выполнения. Я обнаружил, что это связано с отсутствием Host в запросе, ClientIP() метода и тела запроса. Как я могу установить их в тестовом контексте?

Вот что я получил до сих пор. Ошибка на линии с Host: c.Request.Host.

Контроллер:

type loggingControllers struct {
    LoggingService services.InterfaceLogging
}

func (l *loggingControllers) RegisterError(c *gin.Context) {
    errorEvent := models.Error{
        Badges:    map[string]string{},
        Host:      c.Request.Host,
        ClientIP:  c.ClientIP(),
        UserAgent: c.Request.UserAgent(),
        Count:     1,
        Timestamp: time.Now().Unix(),
    }

    err := json.NewDecoder(c.Request.Body).Decode(&errorEvent)
    if err != nil {
        utils.RespondWithError(c, http.StatusInternalServerError, err.Error())
        return
    }

    go l.LoggingService.SaveError(errorEvent)

    utils.RespondWithSuccess(c)
}

func GetLoggingControllerMock() loggingControllers {
    loggingServiceMock := services.GetLoggingServiceMock()

    return loggingControllers{
        LoggingService: &loggingServiceMock,
    }
}

Модульный тест:

func TestLoggingControllers(t *testing.T) {
    loggingControllers := GetLoggingControllerMock()

    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    loggingControllers.RegisterError(c)
}

Сообщение об ошибке:

--- FAIL: TestLoggingControllers (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x15238ec]

1 Ответ

0 голосов
/ 11 апреля 2020

Благодаря комментарию Адриана я нашел решение.

func TestLoggingControllers(t *testing.T) {
    loggingControllers := GetLoggingControllerMock()

    w := httptest.NewRecorder()
    c, r := gin.CreateTestContext(w)

    r.POST("/", loggingControllers.RegisterError)

    c.Request, _ = http.NewRequest(http.MethodPost, "/", bytes.NewBuffer([]byte("{}")))

    r.ServeHTTP(w, c.Request)

    if w.Code != http.StatusOK {
        t.Errorf("Expected status %d, got %d", http.StatusOK, w.Code)
    }
}
...