进行单元测试 - 调用数据库事务开始,不是预期的错误

标签 go go-gorm testify go-sqlmock

我正在尝试使用 Data Dog 的 go-sqlmocktestify 在 Go 中编写模型单元测试。

我有以下代码:

type Suite struct {
    suite.Suite
    DB *gorm.DB
    mock sqlmock.Sqlmock

    repository      Repository
    user *models.User
}

func (s *Suite) SetupSuite() {
    var (
        db  *sql.DB
        err error
    )

    db, s.mock, err = sqlmock.New()
    require.NoError(s.T(), err)

    s.DB, err = gorm.Open("mysql", db)
    require.NoError(s.T(), err)

    s.DB.LogMode(true)

    s.repository = CreateRepository(s.DB)
}

func (s *Suite) AfterTest(_, _ string) {
    require.NoError(s.T(), s.mock.ExpectationsWereMet())
}

func TestInit(t *testing.T) {
    suite.Run(t, new(Suite))
}

func (s *Suite) Test_repository_Get() {
    var (
        ID        = 1234
        CountryID = 1
    )

    s.mock.ExpectQuery(regexp.QuoteMeta(
        `SELECT * FROM "User" WHERE (id = $1)`)).
        WithArgs(strconv.Itoa(ID)).
        WillReturnRows(sqlmock.NewRows([]string{"ID", "CountryID"}).
            AddRow(strconv.Itoa(ID), strconv.Itoa(CountryID)))

    res, err := s.repository.Get(ID)

    require.NoError(s.T(), err)
    require.Nil(s.T(), deep.Equal(&models.User{ID: ID, CountryID: CountryID}, res))
}

func (s *Suite) Test_repository_Create() {
    var (
        ID        = 1234
        CountryID = 1
    )

    s.mock.ExpectQuery(regexp.QuoteMeta(
        `INSERT INTO "User" ("ID","CountryID") 
            VALUES ($1,$2) RETURNING "User"."ID"`)).
        WithArgs(ID, CountryID).
        WillReturnRows(
            sqlmock.NewRows([]string{"ID"}).AddRow(strconv.Itoa(ID)))

    err := s.repository.Create(ID, CountryID)

    require.NoError(s.T(), err)
}

但是当我运行 TestInit 时,我收到以下错误:

> call to database transaction Begin, was not expected, next expectation
> is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:
>   - matches sql: 'INSERT INTO "User" \("ID","CountryID"\)             VALUES \(\$1,\$2\) RETURNING "User"\."ID"'
>   - is with arguments:
>     0 - 1234
>     1 - 1
>   - should return rows:
>     row 0 - [1234] [0m

我有几个问题:

  1. 这里有什么问题?
  2. 有没有办法知道 SetupSuite 函数是否正在运行?
  3. 为什么我会得到 ?我的项目 [无测试文件] 当我运行 go test 时?这是上面代码的文件路径:my-project/test/models/User_test.go

最佳答案

您需要在 Test_repository_Create 上添加 s.mock.ExpectBegin()s.mock.ExpectCommit():

s.mock.ExpectBegin()
s.mock.ExpectQuery(regexp.QuoteMeta(
        `INSERT INTO "User" ("ID","CountryID") 
            VALUES ($1,$2) RETURNING "User"."ID"`)).
        WithArgs(ID, CountryID).
        WillReturnRows(
            sqlmock.NewRows([]string{"ID"}).AddRow(strconv.Itoa(ID)))
s.mock.ExpectCommit()

关于进行单元测试 - 调用数据库事务开始,不是预期的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58804606/

相关文章:

go - 如何比较两个结构、 slice 或映射是否相等?

selenium - 无法创建 selenium.NewRemote

go - gorm 为什么不在日志中报告插入错误?

mysql - 我们如何使用 go 例程同时运行查询?

go - 如何接收 testify 框架 "assert"方法中的方法返回的多个值作为参数?

go - 如果关键测试失败如何中止测试

go - 了解测试覆盖率

go - Go select如何决定运行到默认分支?

unit-testing - 无法在 GoLand IDE 内的测试套件中运行单个测试?

mysql - GORM : Always return empty results,即使记录存在