簡體   English   中英

如何在 go-sqlmock 中添加多個結果集?

[英]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 的回答,但沒有得到想要的輸出。 出於某種原因,它只使用了myMockRowsmyMockRows2被忽略了。 我做了一些閱讀,我們可以執行以下操作以使其返回多行。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM