【问题标题】:How to mock gorm insert with go-sql (postgres)如何使用 go-sql (postgres) 模拟 gorm 插入
【发布时间】:2020-05-26 01:55:11
【问题描述】:

我正在使用 Gorm 和 postgresql 驱动程序。我尝试使用 go-sqlmock 模拟数据库插入:

type Test struct {
    FirstName string `json:"first_name"`
}

func (db *DB) CreateTest() (*Test, error) {
    test := Test{"c"}
    if result := db.Create(&test); result.Error != nil {
        return nil, result.Error
    }

    return &test, nil
}


func TestCreateUser(t *testing.T) {
    _, mock, _ := sqlmock.NewWithDSN("sqlmock_db_0")

    mockedGorm, _ := gorm.Open("sqlmock", "sqlmock_db_0")
    defer mockedGorm.Close()
    myDB := &DB{mockedGorm}

    mock.ExpectExec("INSERT INTO test").WithArgs("c").WillReturnResult(sqlmock.NewResult(1, 1))
    myDB.Exec("INSERT INTO test(first_name) VALUES (?)", "c")


    if _, err := myDB.CreateTest(); err != nil {
        t.Errorf("error was not expected: %s", err)
    }

    if err := mock.ExpectationsWereMet(); err != nil {
        t.Errorf("there were unfulfilled expectations: %s", err)
    }
}

不幸的是,这给了我一个错误:

error was not expected: all expectations were already fulfilled, call to database transaction Begin was not expected

如何使用 gorm、postgresql 和 sql-mock 正确测试插入?

【问题讨论】:

  • 错误信息非常明确。 “开始不是预期的”。你没有告诉它期待一个 Begin,这显然是 GORM 正在执行的。您需要什么帮助?
  • 我不知道谁对你的问题投了反对票,但对 SO 的所有投票都是故意匿名的,要求其他任何内容都是不合适的。
  • 此外,我已经提供了一条评论,解释了否决票的可能原因,所以在你问之前,你已经有了一个(可能的)解释。
  • 我从不质疑匿名性,我只是说我没有看到任何明显的原因导致我的问题被否决,因此无法改进(或任何未来的问题)。虽然错误消息确实非常明确,并且您在评论中强调了这一点,但对我来说并不是那么明显。如果是这样,我一开始就不必问这个问题。但也许我应该更清楚一点,我刚刚开始使用 go-sqlmock 和 Go。

标签: go testing go-gorm go-sqlmock


【解决方案1】:

我的代码有几个问题:

1) 正如@flimzy 正确指出的那样,必须有一个ExpectBegin()(和ExpectCommit())声明。如果打开显示 GORM 正在做什么的 GORM 调试器,这一点会变得更加明显。

2) ExpectExec("INSERT INTO test").WithArgs("c") 显然不匹配 myDB.Exec("INSERT INTO test(first_name) VALUES (?)", "c")

3) 必须转义语句,因为 go-sqlmock 需要一个正则表达式,这里 Go 的 https://godoc.org/regexp#QuoteMeta 派上用场了。

工作代码:

mock.ExpectBegin()
mock.ExpectExec(regexp.QuoteMeta("INSERT INTO \"tests\" (\"first_name\") VALUES (?)")).WithArgs("c").WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2020-07-15
    • 1970-01-01
    • 2019-11-20
    • 2021-06-06
    相关资源
    最近更新 更多