SQLMock - имитация связанного запроса DELETE
В настоящее время я пытаюсь написать тест для запроса к базе данных, но застрял, пытаясь понять, как его имитировать.
У меня есть следующая структура (для справки):
type User struct {
ID uint `gorm:"column:id;primary_key"`
CreatedAt time.Time `gorm:"column:created_at"`
UpdatedAt time.Time `gorm:"column:updated_at"`
GroupID uint `gorm:"column:group_id" sql:"index"`
}
и у меня есть запрос, который удаляет все Users
с тем же GroupID
:
/*
user is an empty User struct
groupID is an uint declared during test initialization (in this case, set to value 1)
*/
err := d.db.Where("group_id = ?", groupID).Delete(&user).GetErrors()
По-видимому, приведенный выше запрос приводит к следующему (извлеченному из ошибки теста):
call to ExecQuery 'DELETE FROM "users" WHERE (group_id = $1)' with args [{Name: Ordinal:1 Value:1}]
Я могу сопоставить строку запроса, но я не могу сопоставить аргумент, поскольку он передается как структура. Можно ли имитировать этот вызов с помощью go-sqlmock или мне нужно изменить свой запрос, чтобы иметь возможность имитировать его?
1 ответ
да, это можно издеваться с помощью go-sqlmock,
Для этого запроса err = s.Db.Delete(&user).Error
я так издевался
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()
mock.ExpectBegin()
mock.ExpectExec(regexp.QuoteMeta("DELETE")).WithArgs(1).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()
gormdb, err := gorm.Open("postgres", db)
if err != nil {
t.Errorf("Failed to open gorm db, got error: %v", err)
}