对多个预期查询使用相同的预期行 returns 结果仅适用于 sqlmock 的第一个

Using same expected rows for multiple expected queries returns result just for the first one with sqlmock

我正在 go 中用 sqlmock 编写测试。我有一个行列表(例如 myRows)和两个不同的 SELECT 语句,我想使用 myRows 作为它们两个的 WillReturnRows 参数:

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

当我在第一个 WillReturnRows 中使用它时,结果是 returns 1。但是在第二次使用中,没有行被 returned 作为结果;我的意思是空行 returns。我在第一次调用前后打印了 myRows 以检查它是否已被消耗;对象没有变化:

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

编辑 1:

我使用了下面的代码并且有效;这意味着两个查询 return 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)

快速浏览 source 表明该实例无法重复使用,您必须创建与 select 查询一样多的 sqlmock.Rows 实例你期待。每次您的代码在 sql.Rows 实例上调用 Next 时,无论是直接还是间接,sqlmock.Rows 中的位置都会递增,因此......第二个查询没有更多行可以扫描。