go - 如何使用 go-sql (postgres) 模拟 gorm 插入

标签 go testing go-gorm go-sqlmock

我正在使用 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 正确测试插入?

最佳答案

我的代码有几个问题:

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()

关于go - 如何使用 go-sql (postgres) 模拟 gorm 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60155628/

相关文章:

testing - 使用突变测试查找代码中的错误

sql-server - 使用gorm错误连接到sql server命名实例,主机名中出现无效字符 "\\"

postgresql - 虫 : pq duplicate key violates unique constraint

cookies - Golang中如何查看cookieJar的内容?

go - 为什么使用自定义 log.Logger 记录到文件会失败?

iphone - UIAutomation 可以用于 CI 吗?

javascript - 测试调用 API 的函数

postgresql - 如何在不影响应用程序源代码的情况下连接Postgres ReadRepica for Reads

go - 为什么类型转换在编译时会失败?

go - 如何让多个模型在 gorm 中自动迁移