Тесту не удается зафиксировать вывод журнала

Я пытаюсь проверить свою UserRegister функциональность, требуется http запрос.

Если пользователь вводит уже существующую электронную почту, UserRegister возвращает журнал ошибок (используя logrus).

logs "github.com/sirupsen/logrus"

func UserRegister(res http.ResponseWriter, req *http.Request) {

    requestID := req.FormValue("uid")
    email := req.FormValue("email")

    logs.WithFields(logs.Fields{
        "Service":  "User Service",
        "package":  "register",
        "function": "UserRegister",
        "uuid":     requestID,
        "email":    email,
    }).Info("Received data to insert to users table")

    // check user entered new email address
    hasAccount := checkemail.Checkmail(email, requestID) // returns true/false

    if hasAccount != true { // User doesn't have an account

        db := dbConn()

        // Inserting token to login_token table
        insertUser, err := db.Prepare("INSERT INTO users (email) VALUES(?)")
        if err != nil {
            logs.WithFields(logs.Fields{
                "Service":  "User Service",
                "package":  "register",
                "function": "UserRegister",
                "uuid":     requestID,
                "Error":    err,
            }).Error("Couldnt prepare insert statement for users table")
        }
        insertUser.Exec(email)
        defer db.Close()
        return
    } // user account created

    logs.WithFields(logs.Fields{
        "Service":  "User Service",
        "package":  "register",
        "function": "UserRegister",
        "uuid":     requestID,
        "email":    email,
    }).Error("User has an account for this email")


}

В моем тестовом модуле я использовал следующее.

func TestUserRegister(t *testing.T) {
    rec := httptest.NewRecorder()
    req, _ := http.NewRequest("POST", "http://localhost:7071/[email protected]&uid=sjfkjsdkf9w89w83490w", nil)

    UserRegister(rec, req)

    expected := "User has an account for this email"

    res := rec.Result()
    content, err := ioutil.ReadAll(res.Body)

    if err != nil {
        t.Error("Couldnt read body", err)
    }

    val, err := strconv.Atoi(string(bytes.TrimSpace(content)))

    if err != nil {
        log.Println("Error parsing response", err)
    }
    if string(val) != expected { 
        t.Errorf("Expected %s, got %s", expected, string(content))
    }

}

Результат: Ошибка синтаксического анализа ответа strconv.Atoi: синтаксический анализ "": неверный синтаксис

Почему ответ не может быть преобразован?

Проверенные темы:

Почему этот код Golang преобразовать строку в целое число не удалось.

Изменить: после ответа @chmike.

Это часть микросервиса. Все ответы пишутся на API-Gateway. Использование функции.

Но здесь я просто хочу выполнить модульный тест и проверить, работает ли мой UserRegister так, как ожидалось.


person Sachith Muhandiram    schedule 09.01.2020    source источник
comment
Aou анализирует тело вашего ответа как строку. strconv.Atoi размещенный в вашем коде не имеет ничего общего с логом. Похоже, вы возвращаете пустой ответ тела в случае ошибки. Поделитесь полным кодом обработчика, если вам нужна дополнительная помощь.   -  person Dmitry Harnitski    schedule 09.01.2020


Ответы (2)


Функция UserRegister никогда не пишет в res и не устанавливает статус. Как следствие, вы получаете пустую строку из res в TestUserRegister. content — это пустая строка, и преобразование пустой строки в целое число с Atoi завершается ошибкой, так как нет целого числа для преобразования.

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

person chmike    schedule 09.01.2020
comment
добавил детали в вопрос. - person Sachith Muhandiram; 09.01.2020
comment
@SachithMuhandiram данные детали не помогают. Вы должны предоставить отзыв об успешном или неудачном выполнении функции UserRegister. Вы должны решить, что это за обратная связь. Это может быть статус, установленный на 200 в случае успеха и другое значение в случае неудачи, или вы можете записать данные в res. В тестовой функции вы должны проверить статус или контент в соответствии с обратной связью, которую вы решили использовать. Если вы используете Atoi, я полагаю, вы ожидали, что обратная связь будет целым числом, представленным в содержании ответа. Почему бы вам не записать это целое число в res в функции UserRegister? - person chmike; 09.01.2020
comment
Спасибо за руководство. Кажется, мне придется реструктурировать свое приложение с настройкой ответа и принятия решений на statusCode - person Sachith Muhandiram; 09.01.2020

Ответ http, который вы читаете, не является ответом на ваш запрос. Вы создаете ответ и ожидаете, что в нем что-то есть. Я не буду. Таким образом, вы пытаетесь создать целое число из пустой строки.

Посмотрите на несколько примеров, чтобы увидеть, откуда может прийти реальный отклик. https://golang.org/pkg/net/http

person Sean F    schedule 09.01.2020
comment
Да, но для этого я просто хочу проверить эти выходные данные журнала и выполнить их проверку. - person Sachith Muhandiram; 09.01.2020