Как передать данные json в качестве параметра запроса при насмешке с использованием gin framework

У меня есть функция для создания пользователя, который работает правильно. Теперь мне нужно смоделировать функцию Prepare and SaveUser внутри CreateUser. Но для этого CreateUser требуются данные json в качестве параметра запроса. Ниже моя функция CreateUser.

func (server *Server) CreateUser(c *gin.Context) {
    errList = map[string]string{}
    user := models.User{}
    if err := c.ShouldBindJSON(&user); err != nil {
        log.Println(err)
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})  **//every time return from here with error -> invalid request**
        return
    }
    user.Prepare()

    userCreated, err := sqlstore.SaveUser(&user)
    if err != nil {
        formattedError := formaterror.FormatError(err.Error())
        errList = formattedError
        c.JSON(http.StatusInternalServerError, gin.H{
            "status": http.StatusInternalServerError,
            "error":  errList,
        })
        return
    }

    c.JSON(http.StatusCreated, gin.H{
        "status":   http.StatusCreated,
        "response": userCreated,
    })
}

Это необходимые данные json в качестве параметра запроса для выше созданного пользователя. Я хочу передать ниже данные во время насмешки.

{"firstname":"test","email":"[email protected]"}

Ниже приведен тестовый пример для создания пользовательской функции.

type UserMock struct {
    mock.Mock
}
func (u *UserMock) Prepare() (string, error) {
    args := u.Called()
    return args.String(0), args.Error(1)
}
func (u *UserMock) SaveUser() (string, error) {
    args := u.Called()
    return args.String(0), args.Error(1)
}
func TestCreateUser(t *testing.T) {
    gin.SetMode(gin.TestMode)
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)
    **//how to json data as request parameter**
    uMock := UserMock{}
    uMock.On("Prepare").Return("mocktest", nil)
    server := Server{}
    server.CreateUser(c)
    if w.Code != 201 {
        t.Error("Unexpected status code found : ",w.Code)
    }
}

Заранее спасибо.


person Amit Upa    schedule 26.03.2020    source источник
comment
Какой у Вас вопрос?   -  person Adrian    schedule 26.03.2020
comment
@Adrian, как мне передать данные json в качестве параметра запроса. Например, я хочу установить {"firstname":"test","email":"[email protected]"} контекст gin (c), чтобы при запуске тестового примера c.ShouldBindJSON() это не должно было вызвать ошибку   -  person Amit Upa    schedule 26.03.2020


Ответы (1)


Вам нужно добавить strings.NewReader(string(myjson)) в новый запрос. Пожалуйста, проверьте это и используйте его в качестве шаблона для вашего текущего кода GIN.

// TestCreateUser new test
func TestCreateUser(t *testing.T) {

    // Setup Recorder, TestContext, Router
    router := getRouter(true)
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // set JSON body
    jsonParam := `{"firstname":"test","email":"[email protected]"}`

    // Mock HTTP Request and it's return
    req, err := http.NewRequest("POST", "/user", strings.NewReader(string(jsonParam)))

    // make sure request was executed
    assert.NoError(t, err)

    // Serve Request and recorded data
    router.ServeHTTP(w, req)

    // Test results
    assert.Equal(t, 200, w.Code)
    assert.Equal(t, nil, w.Body.String()) 
    // check your response since nil isn't valid return

}
person Eddwin Paz    schedule 26.03.2020
comment
Это делается с помощью мультиплексора. Можем ли мы вместо этого использовать gin router. - person Amit Upa; 27.03.2020
comment
@AmitUpa, как я уже упоминал, является шаблоном, проверьте http.NewRequest(), чтобы смоделировать запрос. и передайте свой JSON вместе с данными. Я попробую сделать это для Джина. позже сегодня. Думал, ты поймешь эту идею... :) не волнуйся. - person Eddwin Paz; 27.03.2020
comment
@AmitUpa, не могли бы вы еще раз проверить ответ, он обновлен. - person Eddwin Paz; 27.03.2020
comment
Эй @Eddwin, спасибо за ваш ответ, я проверяю ваш ответ, он работает, но я не могу издеваться над Prepare() and SaveUser() - person Amit Upa; 27.03.2020
comment
@AmitUpa, так как вы проводите сквозное тестирование. вам нужно смоделировать вашу пользовательскую сущность и передать ее по запросу с обработчиком маршрутизатора; это означает необходимость передачи метода http, параметров и ожидаемого возврата. какой шаблон кодирования вы используете здесь? потому что я вижу некоторые пробелы в структурах, которые вы представляете, например структура server {}, а userMock ничего не содержит. - person Eddwin Paz; 27.03.2020
comment
Теперь, когда у вас есть макет запроса, вам нужно использовать маршрутизатор и функцию CreateUser. и передайте userMock, который будет данными, которые будет возвращать ваша функция. Я добавлю больше кода, чтобы показать вам. - person Eddwin Paz; 27.03.2020