Почему "mock.ExpectQuery" return "без аргументов"

Ниже мой файл модульного теста:

func TestAddLike(t *testing.T) {
    db, mock, err := sqlmock.New()

    if err != nil {
        t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    }

    defer db.Close()

    rows := sqlmock.NewRows([]string{"id", "title", "body"}).
        AddRow(1, "post 1", "hello").
        AddRow(2, "post 2", "world")

    mock.ExpectQuery("SELECT (.+) FROM testmock").
        WillReturnRows(rows)

    if err := mock.ExpectationsWereMet(); err != nil {
        t.Errorf("there were unfulfilled expectations: %s", err)
    }

}

ht tps:https://stackru.com/images/f5f3ac1ac0815e98877601f7d1fa0d542c8addcf.png

ht tps:https://stackru.com/images/6bbe0a0e39056d415495d464046f71e50ff285b7.png

фреймворк:gin

база данных: gorm

Я хочу написать модульный тест..

У меня два вопроса:

  1. Как sqlmock.New() выбрать базу данных?
  2. Почему mock.ExpectQuery возвращение is without argument

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

1 ответ

Решение
  1. Как sqlmock.New() выбирает базу данных?

Ответ: Он не делает фактического обращения к базе данных. ЭтоMock что означает ненастоящую базу данных.

  1. Почему возврат mock.ExpectQuery без аргументов

Ответ: я не вижу звонкаAddLike() внутри TestAddLike(t *testing.T). Попробуйте и это:

func TestAddLike(t *testing.T) {
    db, mock, err := sqlmock.New()

    if err != nil {
        t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    }

    defer db.Close()

    rows := sqlmock.NewRows([]string{"id", "title", "body"}).
        AddRow(1, "post 1", "hello").
        AddRow(2, "post 2", "world")

    mock.ExpectQuery("SELECT (.+) FROM testmock").
        WillReturnRows(rows)
 
    AddLike() // <- Add the call to actual function here. Before mock.ExpectationsWereMet

    if err := mock.ExpectationsWereMet(); err != nil {
        t.Errorf("there were unfulfilled expectations: %s", err)
    }

}
  1. Я хочу проверить свою базу данных, увеличилась ли она

Ответ: Нельзя. Основная цель написания модульного теста - изолировать (независимо от фактических вызовов базы данных или вызовов API к какому-либо серверу) функцию и проверить логику функции на основе вывода этих зависимостей (например, БД выдаетerror или APIвызов возвращает другой ответ). Вызов реальной БД нарушит это правило. Вот тут и вступают в действие интеграционные тесты.

Теперь в рамках модульного теста вы проверяете только:

  • если правильный SQL запрос передается в макет SQL
  • Как только вы вернете mock ответ БД, убедитесь, что вывод функции такой expected
Другие вопросы по тегам