Использование одинаковых ожидаемых строк для нескольких ожидаемых запросов возвращает результат только для первого с 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
увеличивается, и поэтому... у второго запроса больше нет строк для сканирования.