【发布时间】:2020-05-18 07:43:27
【问题描述】:
我正在用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)
【问题讨论】:
-
您假设问题在于重新使用
*sqlmock.Rows实例...这是否意味着您已尝试创建两个*sqlmock.Rows实例并且您已将它们分别用于单独的查询,在那个测试中,一切都按预期工作? -
@mkopriva,是的。这正是发生的事情。我将编辑我的问题。
-
快速浏览source 表明该实例无法重复使用,您必须创建与您期望的选择查询一样多的
sqlmock.Rows实例。每次您的代码在sql.Rows实例上调用Next时,sqlmock.Rows中的位置都会增加,因此……第二个查询没有更多行要扫描。 -
谢谢@mkopriva,您能否将其添加为答案?
标签: go testing go-sqlmock