Почему "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
Я хочу написать модульный тест..
У меня два вопроса:
- Как
sqlmock.New()
выбрать базу данных? - Почему
mock.ExpectQuery
возвращениеis without argument
Заранее спасибо.
1 ответ
- Как sqlmock.New() выбирает базу данных?
Ответ: Он не делает фактического обращения к базе данных. ЭтоMock
что означает ненастоящую базу данных.
- Почему возврат 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)
}
}
- Я хочу проверить свою базу данных, увеличилась ли она
Ответ: Нельзя. Основная цель написания модульного теста - изолировать (независимо от фактических вызовов базы данных или вызовов API к какому-либо серверу) функцию и проверить логику функции на основе вывода этих зависимостей (например, БД выдаетerror
или API
вызов возвращает другой ответ). Вызов реальной БД нарушит это правило. Вот тут и вступают в действие интеграционные тесты.
Теперь в рамках модульного теста вы проверяете только:
- если правильный
SQL
запрос передается в макет SQL - Как только вы вернете
mock
ответ БД, убедитесь, что вывод функции такойexpected