【问题标题】:Using same expected rows for multiple expected queries returns result just for the first one with sqlmock对多个预期查询使用相同的预期行仅返回带有 sqlmock 的第一个查询的结果
【发布时间】:2020-05-18 07:43:27
【问题描述】:

我正在用sqlmockgo 中编写测试。我有一个行列表(例如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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多