go-sqlmock icon indicating copy to clipboard operation
go-sqlmock copied to clipboard

go-sqlmock with gorm

Open majidbl opened this issue 4 years ago • 10 comments
trafficstars

how i can use go-sqlmock for newer version of gorm in my project

majidbl avatar Feb 03 '21 15:02 majidbl

What is the question here? What errors are you getting?

I haven't had any issues while using gorm.io/gorm v1.20.11 (gORM v2) with go-sqlmock v1.5.0

Anonyma avatar Feb 05 '21 16:02 Anonyma

my error is : call to ExecQuery 'INSERT INTO "users" ("id","user_name","pass_word","email","role","name","created_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8)' with args [{Name: Ordinal:1 Value:a8813f4a-bd82-4dd2-bdd9-fbcf0aa7787f} {Name: Ordinal:2 Value:test} {Name: Ordinal:3 Value:12345} {Name: Ordinal:4 Value:testemail} {Name: Ordinal:5 Value:admin} {Name: Ordinal:6 Value:test} {Name: Ordinal:7 Value:2020-11-18 16:36:03.948311091 +0330 +0330 m=+0.005700519} {Name: Ordinal:8 Value:2020-11-18 16:36:03.94831117 +0330 +0330 m=+0.005700600}] was not expected; call to Rollback transaction was not expected [0.300ms] [rows:0] INSERT INTO "users" ("id","user_name","pass_word","email","role","name","created_at","updated_at") VALUES ('a8813f4a-bd82-4dd2-bdd9-fbcf0aa7787f','test','12345','testemail','admin','test','2020-11-18 16:36:03.948','2020-11-18 16:36:03.948') --- FAIL: TestSignUp (0.00s) postgersql_test.go:96: Failed to insert to gorm db, got error: call to ExecQuery 'INSERT INTO "users" ("id","user_name","pass_word","email","role","name","created_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8)' with args [{Name: Ordinal:1 Value:a8813f4a-bd82-4dd2-bdd9-fbcf0aa7787f} {Name: Ordinal:2 Value:test} {Name: Ordinal:3 Value:12345} {Name: Ordinal:4 Value:testemail} {Name: Ordinal:5 Value:admin} {Name: Ordinal:6 Value:test} {Name: Ordinal:7 Value:2020-11-18 16:36:03.948311091 +0330 +0330 m=+0.005700519} {Name: Ordinal:8 Value:2020-11-18 16:36:03.94831117 +0330 +0330 m=+0.005700600}] was not expected; call to Rollback transaction was not expected postgersql_test.go:101: Failed to meet expectations, got error: there is a remaining expectation which was not matched: ExpectedQuery => expecting Query, QueryContext or QueryRow which:

  • matches sql: 'INSERT INTO "users" ("id","user_name", "pass_word","email","role","name","created_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING "users"."id";'
  • is with arguments: 0 - a8813f4a-bd82-4dd2-bdd9-fbcf0aa7787f 1 - test 2 - 12345 3 - testemail 4 - admin 5 - test 6 - {} 7 - {}
  • should return rows: row 0 - [a8813f4a-bd82-4dd2-bdd9-fbcf0aa7787f] FAIL

majidbl avatar Feb 06 '21 13:02 majidbl

every thing is ok but test failed

majidbl avatar Feb 06 '21 13:02 majidbl

I think your expectation is wrong, instead of ExpectQuery seems like there is ExpectExec needed. Update and insert statements are not Query

l3pp4rd avatar Feb 06 '21 16:02 l3pp4rd

all thing same like before, nothing changed

majidbl avatar Feb 08 '21 08:02 majidbl

Either assert an exact match of the arguments you are passing or use sqlmock.AnyArg() (passing as many sqlmock.AnyArg() as arguments you have)

Anonyma avatar Feb 08 '21 16:02 Anonyma

Check your expectation. Be sure you're expecting what your statement is returning and, if you haven't done yet, you might want to see GORM debugger by adding ExpectBegin() and ExpectCommit().

joaquinicolas avatar Feb 08 '21 17:02 joaquinicolas

package main

import (
	"database/sql"
	"regexp"
	"testing"

	"gopkg.in/DATA-DOG/go-sqlmock.v1"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
)

type Student struct {
	//*gorm.Model
	Name string
	ID string
}
type v2Suite struct {
	db      *gorm.DB
	mock    sqlmock.Sqlmock
	student Student
}

func TestGORMV2(t *testing.T) {
	s := &v2Suite{}
	var (
		db  *sql.DB
		err error
	)

	db, s.mock, err = sqlmock.New()
	if err != nil {
		t.Errorf("Failed to open mock sql db, got error: %v", err)
	}

	if db == nil {
		t.Error("mock db is null")
	}

	if s.mock == nil {
		t.Error("sqlmock is null")
	}

	dialector := postgres.New(postgres.Config{
		DSN:                  "sqlmock_db_0",
		DriverName:           "postgres",
		Conn:                 db,
		PreferSimpleProtocol: true,
	})
	s.db, err = gorm.Open(dialector, &gorm.Config{})
	if err != nil {
		t.Errorf("Failed to open gorm v2 db, got error: %v", err)
	}

	if s.db == nil {
		t.Error("gorm db is null")
	}

	s.student = Student{
		ID:   "123456",
		Name: "Test 1",
	}

	defer db.Close()

	s.mock.MatchExpectationsInOrder(false)
	s.mock.ExpectBegin()

	s.mock.ExpectQuery(regexp.QuoteMeta(
		`INSERT INTO "students" ("id","name")
					VALUES ($1,$2) RETURNING "students"."id"`)).
	WithArgs(s.student.ID, s.student.Name).
	WillReturnRows(sqlmock.NewRows([]string{"id"}).
			AddRow(s.student.ID))

	s.mock.ExpectCommit()

	if err = s.db.Create(&s.student).Error; err != nil {
		t.Errorf("Failed to insert to gorm db, got error: %v", err)
	}

	err = s.mock.ExpectationsWereMet()
	if err != nil {
		t.Errorf("Failed to meet expectations, got error: %v", err)
	}
}

majidbl avatar Feb 09 '21 08:02 majidbl

that is my example source

majidbl avatar Feb 09 '21 08:02 majidbl

Link GORM related issue which was resolved by GORM author gorm v2.0 unit testing with sqlmock: https://github.com/go-gorm/gorm/issues/3565

valtab avatar Sep 26 '21 13:09 valtab