使用gorm和sql-mock编写单元测试时遇到的问题

huangapple go评论162阅读模式
英文:

Problem writing a unit test using gorm and sql-mock

问题

这是我使用testing、gorm和sql-mock包的函数:

  1. func Test_Create(t *testing.T) {
  2. db, mock, err := sqlmock.New()
  3. if err != nil {
  4. t.Errorf("无法打开模拟的SQL数据库,错误信息:%v", err)
  5. }
  6. if db == nil {
  7. t.Error("db为空")
  8. }
  9. if mock == nil {
  10. t.Error("mock为空")
  11. }
  12. defer db.Close()
  13. pDb, err := gorm.Open(postgres.New(postgres.Config{
  14. PreferSimpleProtocol: false,
  15. DriverName: "postgres",
  16. Conn: db,
  17. }))
  18. if err != nil {
  19. t.Fatalf("gorm打开postgres失败:%v", err)
  20. }
  21. student := Student{
  22. ID: 12345,
  23. Name: "测试用户",
  24. }
  25. mock.ExpectBegin()
  26. mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO "students" ("id","name") VALUES ($1,$2) RETURNING "id"`)).WithArgs(student.ID, student.Name).WillReturnResult(sqlmock.NewResult(student.ID, 1))
  27. mock.ExpectCommit()
  28. err = pDb.Create(student).Error
  29. if err != nil {
  30. t.Error("错误信息:", err)
  31. }
  32. }

我不明白为什么在创建单元测试时会出现错误,就像下面的示例一样,有人可以帮忙吗?

英文:

this is my funckion using package testing, gorm and sql-mock:

  1. func Test_Create(t *testing.T) {
  2. db, mock, err := sqlmock.New()
  3. if err != nil {
  4. t.Errorf("Failed to open mock sql db, got error: %v", err)
  5. }
  6. if db == nil {
  7. t.Error("db is null")
  8. }
  9. if mock == nil {
  10. t.Error("mock is null")
  11. }
  12. defer db.Close()
  13. pDb, err := gorm.Open(postgres.New(postgres.Config{
  14. PreferSimpleProtocol: false,
  15. DriverName: "postgres",
  16. Conn: db,
  17. }))
  18. if err != nil {
  19. t.Fatalf("gorm postgres fatal: %v", err)
  20. }
  21. student := Student{
  22. ID: 12345,
  23. Name: "Test user",
  24. }
  25. mock.ExpectBegin()
  26. mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO "students" ("id","name") VALUES ($1,$2) RETURNING "id"`)).WithArgs(student.ID, student.Name).WillReturnResult(sqlmock.NewResult(student.ID, 1))
  27. mock.ExpectCommit()
  28. err = pDb.Create(student).Error
  29. if err != nil {
  30. t.Error("error:", err)
  31. }
  32. }

I don't understand why I have an error creating a unit test as in the example below, can anyone help?

答案1

得分: 1

好的,我已经解决了这个问题。这是工作的函数:

  1. func Test_Create(t *testing.T) {
  2. db, mock, err := sqlmock.New()
  3. if err != nil {
  4. t.Errorf("无法打开模拟的 SQL 数据库,错误信息:%v", err)
  5. }
  6. if db == nil {
  7. t.Error("db 为空")
  8. }
  9. if mock == nil {
  10. t.Error("mock 为空")
  11. }
  12. defer db.Close()
  13. dialector := postgres.New(postgres.Config{
  14. DSN: "sqlmock_db_0",
  15. DriverName: "postgres",
  16. Conn: db,
  17. PreferSimpleProtocol: true,
  18. })
  19. pDb, err := gorm.Open(dialector, &gorm.Config{})
  20. if err != nil {
  21. t.Fatalf("gorm postgres 致命错误:%v", err)
  22. }
  23. student := Student{
  24. ID: 12345,
  25. Name: "测试用户",
  26. }
  27. mock.ExpectBegin()
  28. mock.ExpectQuery(
  29. regexp.QuoteMeta(`INSERT INTO "students" ("name","id") VALUES ($1,$2) RETURNING "id"`)).
  30. WithArgs(student.Name, student.ID).WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(student.ID))
  31. mock.ExpectCommit()
  32. if err = pDb.Create(&student).Error; err != nil {
  33. t.Errorf("无法插入到 gorm 数据库,错误信息:%v", err)
  34. t.FailNow()
  35. }
  36. err = mock.ExpectationsWereMet()
  37. if err != nil {
  38. t.Errorf("未满足期望,错误信息:%v", err)
  39. }
  40. }
英文:

okay, I've already solved the problem. here's the working func:

  1. func Test_Create(t *testing.T) {
  2. db, mock, err := sqlmock.New()
  3. if err != nil {
  4. t.Errorf("Failed to open mock sql db, got error: %v", err)
  5. }
  6. if db == nil {
  7. t.Error("db is null")
  8. }
  9. if mock == nil {
  10. t.Error("mock is null")
  11. }
  12. defer db.Close()
  13. dialector := postgres.New(postgres.Config{
  14. DSN: "sqlmock_db_0",
  15. DriverName: "postgres",
  16. Conn: db,
  17. PreferSimpleProtocol: true,
  18. })
  19. pDb, err := gorm.Open(dialector, &gorm.Config{})
  20. if err != nil {
  21. t.Fatalf("gorm postgres fatal: %v", err)
  22. }
  23. student := Student{
  24. ID: 12345,
  25. Name: "Test user",
  26. }
  27. mock.ExpectBegin()
  28. mock.ExpectQuery(
  29. regexp.QuoteMeta(`INSERT INTO "students" ("name","id") VALUES ($1,$2) RETURNING "id"`)).
  30. WithArgs(student.Name, student.ID).WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(student.ID))
  31. mock.ExpectCommit()
  32. if err = pDb.Create(&student).Error; err != nil {
  33. t.Errorf("Failed to insert to gorm db, got error: %v", err)
  34. t.FailNow()
  35. }
  36. err = mock.ExpectationsWereMet()
  37. if err != nil {
  38. t.Errorf("Failed to meet expectations, got error: %v", err)
  39. }
  40. }

huangapple
  • 本文由 发表于 2023年1月21日 19:00:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/75192805.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定