【发布时间】: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