[英]How can I add multiple result sets in go-sqlmock?
我有一个返回 2 个结果集的 db 查询,我想对执行此查询的 go 函数进行单元测试。 虽然我可以像这样添加和测试行:
myMockRows:=sqlmock.NewRows([]string{"col1","col2"}).AddRow("col1val1", "col2val2")
mock.ExpectQuery("my_stored_procedure").WithArgs(arg1, arg2).WillReturnRows(myMockRows)
我不确定如何继续在我的rows
对象中创建多个结果集。 我怎么做?
我已经尝试过@Nikhil Vandanapu 的回答,但没有得到想要的输出。 出于某种原因,它只使用了myMockRows
而myMockRows2
被忽略了。 我做了一些阅读,我们可以执行以下操作以使其返回多行。
myMockRows:=sqlmock.NewRows([]string{"col1","col2"})
.AddRow("col1val1", "col2val2")
.AddRow("col1val1", "col2val2")
mock.ExpectQuery("my_stored_procedure").WillReturnRows(myMockRows)
根据godoc 。 值切片返回相同的实例以执行后续操作。
如果您想更轻松地阅读该主题,请添加此博客文章
做这样的事情:
myMockRows:=sqlmock.NewRows([]string{"col1","col2"}).AddRow("col1val1", "col2val2")
myMockRows2:=sqlmock.NewRows([]string{"col3","col4"}).AddRow("col3val1", "col4val2")
mock.ExpectQuery("my_stored_procedure").WithArgs(arg1, arg2).WillReturnRows(myMockRows, myMockRows2)
由于WillReturnRows
接受多个行对象并形成一个切片,因此使用它来构造下一个 Result Set。
您必须将测试行放入struct
,然后像下面的代码一样在struct
执行loop
。
type args struct {
val string
}
tests := []struct {
name string
s *<YourDBstruct>
args args
wantErr bool
}{
{
name: "Test with correct value1",
s: &YourDBstruct{db},
args: args{"Val1"}
wantErr: true,
},
{
name: "Test with correct value2",
s: &YourDBstruct{db},
args: args{"Val2"}
wantErr: true,
},
{
name: "Test with correct valueN",
s: &YourDBstruct{db},
args: args{"ValN"}
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
mock.ExpectExec("my_stored_procedure")
if err := tt.s.YourStoreFuncName(); (err != nil) != tt.wantErr {
t.Errorf("YourStoreFuncName() error = %v, wantErr %v", err, tt.wantErr)
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.