Использование одинаковых ожидаемых строк для нескольких ожидаемых запросов возвращает результат только для первого с sqlmock

Я пишу тесты с sqlmock в go. У меня есть список строк (например,myRows) и два разных SELECT утверждения, которые я хочу использовать myRows в качестве WillReturnRows аргумент для них обоих:

myRows := sqlmock.NewRows([]string{"my_column"}).AddRow(1)
mock.ExpectQuery(firstQuery).WillReturnRows(myRows)
mock.ExpectQuery(secondQuery).WillReturnRows(myRows)

Когда я использую его в первый раз WillReturnRows, он возвращается 1в результате. Но при втором использовании в качестве результата строки не возвращаются; Я имею в виду возвращение пустых строк. Я распечаталmyRowsдо и после первого звонка, чтобы проверить, израсходован он или нет; объект не изменился:

Rows Before:  &{[my_column] [[1]] 0 map[] <nil>}
Rows After:  &{[my_column] [[1]] 0 map[] <nil>}

Изменить 1:

Я использовал следующий код, и он работает; это означает, что оба запроса возвращаются1:

myRows1 := sqlmock.NewRows([]string{"my_column"}).AddRow(1)
myRows2 := sqlmock.NewRows([]string{"my_column"}).AddRow(1)
mock.ExpectQuery(firstQuery).WillReturnRows(myRows1)
mock.ExpectQuery(secondQuery).WillReturnRows(myRows2)

1 ответ

Решение

Беглый взгляд на источник подсказывает, что экземпляр нельзя использовать повторно, вам придется создать столько же экземпляровsqlmock.Rowsкак ожидаемые запросы выбора. Каждый раз, когда ваш код вызываетNext на sql.Rows Например, прямо или косвенно, позиция в sqlmock.Rows увеличивается, и поэтому... у второго запроса больше нет строк для сканирования.

Другие вопросы по тегам