首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go单元测试-调用数据库事务开始,不是预期的错误。

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

Stack Overflow用户
提问于 2019-11-11 15:51:42
回答 1查看 10K关注 0票数 3

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

我有以下代码:

代码语言:javascript
复制
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时,我会得到以下错误:

代码语言:javascript
复制
> 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 [no test files]?这是上面代码的文件路径:my-project/test/models/User_test.go
EN

回答 1

Stack Overflow用户

发布于 2020-03-07 18:12:17

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

代码语言:javascript
复制
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()
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58804606

复制
相关文章

相似问题

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