Задать вопрос
@SSSSTTTTAAAASSSS

INSERT INTO при тестировании через sqlmock?

Добрый день всем!

пишу unit тесты для своего api. Для тестирования postgreSQL использую библиотеку "github.com/DATA-DOG/go-sqlmock"
С очередями SELECT все работает, все тестирует, все ок.

А с командой INSERT не получается ничего. Выдает ошибку и все.
Метод, который пытаюсь протестировать создает запись в базе.
func (pdb *PostgresDB) CreateUser(u models.User) (models.User, error) {
	pdb.mu.Lock()
	defer pdb.mu.Unlock()

	id := uuid.New()
	idStr := id.String()

	_, err := pdb.Pdb.Exec(
		`INSERT INTO users (userID, name, age) VALUES ($1, $2, $3)`, idStr, u.Name, u.Age)
	if err != nil {
		return models.User{}, errors.New("couldn't create user in database")
	}

	u.ID = idStr

	return u, nil
}


соответственно код, который должен добавить запись в базу следующий:
mock.ExpectBegin()
	mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO users`)).
		WithArgs("00000000-0000-0000-0000-000000000000", "name1", 10).
		WillReturnResult(sqlmock.NewResult(1, 1))
	//mock.ExpectQuery(regexp.QuoteMeta(`INSERT INTO "users" \(userID, name, age\) VALUES \(\$1, \$2, \$3\)`)).
	//	WithArgs("00000000-0000-0000-0000-000000000000", "name1", 10).
	//	WillReturnRows(mockedRow)
	mock.ExpectCommit()

Уже пробовал и менять mock.ExpectExec на mock.ExpectQuerry - не помогло. В результат давал вот это
mockedRow := sqlmock.NewRows([]string{"userID", "name", "age"}).AddRow("00000000-0000-0000-0000-000000000000", "name1", 10)

Убирал regexp.QuoteMeta, Вставлял полную команду как и в рабочем коде - ничего не помогает.
Понимаю, что где-то тут ошибка у меня в этом описании мока, но не могу понять где. Begin и Commit убирал ничего не помогает.
Не пойму куда копать...
Буду благодарен за любую подсказку.
Заранее спасибо
  • Вопрос задан
  • 489 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
kvaks
@kvaks
для INSERT нужно добавлять результат и не забывай про обрамлять слешом SQL запросы в mock (regex online)

вот пример кода
mock.ExpectExec(`INSERT INTO Products \(model, company, price\) values \('\$1', \$2, \$3\)`).
				WithArgs(tt.args.model, tt.args.company, tt.args.price).
				WillReturnResult(sqlmock.NewResult(1, 1))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы