首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个Go测试用例中的DB模拟会干扰其他测试用例

一个Go测试用例中的DB模拟会干扰其他测试用例
EN

Stack Overflow用户
提问于 2021-05-03 17:07:22
回答 1查看 123关注 0票数 0

我有两个Go测试用例,如下所示,它们测试一个名为MyEndpoint的gRPC函数。

当它选择的数据库行具有Field1 == "A“时,MyEndpoint应该成功,否则返回错误。

我正在用go-sqlmock package from Data-dog模拟数据库。

代码语言:javascript
复制
package mypackage_test

import (
    "github.com/DATA-DOG/go-sqlmock"
    "github.com/stretchr/testify/require"
)


type MyEntity struct {
    Id                     sql.NullInt32 `db:"id"`  
    Field1                 sql.NullString `db:"field1"`
    Field2                 sql.NullString `db:"field2"`
    Field3                 sql.NullString `db:"field3"`
}

var Columns = []string{
    "id",
    "field_1",
    "field_2",
    "field_3"
}



var dbRow = []driver.Value{int32(999), "A", "B", "C"]


func TestMyTestA(t *testing.T) {
    t.Run("Verify MyEndpoint Fails when mocked Database row has Field1 != A", func(t *testing.T) {
        api, err := getMyAPI()
        require.Nil(t, err)
        defer api.Close()

        api.DBMock.ExpectBegin()
        api.DBMock.MatchExpectationsInOrder(false)

        modifiedDBRow := dbRow
        modifiedDBRow[0] = "Z"
        api.DBMock.ExpectQuery("SELECT").
            WithArgs(int32(999)).WillReturnRows(sqlmock.NewRows(Columns).AddRow(modifiedDBRow...))
        api.DBMock.ExpectCommit()
        
        _, err = ... // Call MyEndpoint with parameter Id: int32(999)
        api.DBMock.ExpectClose()
        require.NotNil(t, err)
    })
}

func TestMyTestB(t *testing.T) {
    t.Run("Verify MyEndpoint succeeds when mocked Database row has Field1 == A", func(t *testing.T) {
        api, err := getMyAPI()
        require.Nil(t, err)
        defer api.Close()

        api.DBMock.ExpectBegin()
        api.DBMock.MatchExpectationsInOrder(false)

        api.DBMock.ExpectQuery("SELECT").
            WithArgs(int32(999)).WillReturnRows(sqlmock.NewRows(Columns).AddRow(dbRow...))
        api.DBMock.ExpectCommit()
        
        _, err = ... // Call MyEndpoint with parameter Id: int32(999)
        api.DBMock.ExpectClose()
        require.Nil(t, err)
    })
}

当我单独运行这两个测试用例时,它们都通过了。

但是当我将它们一起运行时,TestMyTestB失败了,因为它认为Field1 ==是"Z“。因此,很明显,TestMyTestA正在干扰TestMyTestB。为什么?

似乎在TestMyTestA案例中所做的模仿在TestMyTestB中仍然有效,而我在TestMyTestB案例中所做的模仿完全被忽略了。

我如何将这两个测试用例相互独立地模拟出来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-03 18:11:08

这是因为在您的第一个测试中对modifiedDBRow slice的分配不正确。请记住,片并不存储任何数据,它只是描述底层数组的一部分。

因此,当您在第一个测试中修改modifiedDBRow时,您已经内在地将包含[0]的值的底层数组从A修改为Z,当您在下一个测试中读取dbRow时,该值将持续存在。在第一个测试结束时重置该值,或者在测试中使用一组不同的变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67366237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档