Как смоделировать вставку Горм с go - sql (postgres) - PullRequest
0 голосов
/ 10 февраля 2020

Я использую 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 -мок правильно?

1 Ответ

1 голос
/ 12 февраля 2020

Было несколько проблем с моим кодом:

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