如何在go-sqlmock中添加多个结果集?

时间:2018-07-06 14:51:31

标签: unit-testing go

我有一个数据库查询,该查询返回2个结果集,我想对执行此查询的go函数进行单元测试。 虽然我可以像这样添加和测试行:

myMockRows:=sqlmock.NewRows([]string{"col1","col2"}).AddRow("col1val1", "col2val2")
mock.ExpectQuery("my_stored_procedure").WithArgs(arg1, arg2).WillReturnRows(myMockRows)

我不确定如何继续在rows对象中创建多个结果集。我该怎么办?

3 个答案:

答案 0 :(得分:3)

我已经尝试了,@ Nikhil Vandanapu的回答,但没有得到想要的输出。由于某种原因,只花了myMockRows,而myMockRows2被忽略了。我做了一些阅读,我们可以执行以下操作来使其返回多行。

myMockRows:=sqlmock.NewRows([]string{"col1","col2"})
.AddRow("col1val1", "col2val2")
.AddRow("col1val1", "col2val2")

mock.ExpectQuery("my_stored_procedure").WillReturnRows(myMockRows)

根据godoc。值片将返回相同的实例,以执行后续操作。

如果您想更轻松地阅读有关该主题的信息,请添加此blog帖子

答案 1 :(得分:1)

您必须将测试行放入struct内,然后像下面的代码一样在loop上执行struct

 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)
                }
            })

答案 2 :(得分:0)

执行以下操作:

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接受多个行对象并形成一个切片,请使用它来构造下一个结果集。