Пересмешивать базу данных GORM с помощью go-mocket не работает - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь смоделировать базу данных gorm, используя go-mocket, но она не работает так, как должна. Я не отправляю никакие фиктивные данные в мою функцию ClusterExists, чтобы модульный тест не работал так, как я ожидал.

В документации есть два способа насмешки "Простое использование цепочки" и "FakeResponse". Я пробовал обоими способами, и это не работает ни.

Моя функция:

func ClusterExists(cluster *Cluster, db *gorm.DB) bool {
    c := Cluster{}
    exists := !db.Where("cluster_name = ? AND env_type = ?", cluster.ClusterName, cluster.EnvType).First(&c).RecordNotFound()

    return exists
}

Функции My Tests:

func SetupTests() *gorm.DB { 
mocket.Catcher.Register() 
mocket.Catcher.Logging = true
db, err := gorm.Open(mocket.DriverName, "connection_string")
if err != nil {
    log.Fatal(err)
}
db.LogMode(true)
//models.DB = db

return db
}
func TestShouldUpdateStats(t *testing.T){
    t.Run("SIMPLE test", func(t *testing.T){
        DB := SetupTests()
        commonReply := []map[string]interface{}{{"cluster_name":"testname", "env_type":"envtype"}}
        mocket.Catcher.NewMock().WithQuery("SELECT * FROM clusters WHERE").WithReply(commonReply)

        //var declaration
        var testCluster Cluster
        testCluster.ClusterName = "testname"
        testCluster.EnvType = "envtype"

        //assert
        if ClusterExists(&testCluster, DB) {
            t.Errorf("There is a record in the database which already exists:")
        }
    })
}

Поскольку мои testCluster.ClusterName и testCluster.EnvType имеют одинаковое содержимое, которое есть в моей базе данных, я должен получить ошибку:

t.Errorf ("В базе данных уже есть запись:")

Но я никогда не получаю 'true' от функции ClusterExists, поэтому я не могу провалить тест.

Вы знаете, что я делаю не так с Go-Mocket? Есть что-то, чего мне не хватает?

С уважением!

1 Ответ

0 голосов
/ 12 июля 2019

Исправлено!

Я сопоставил свой запрос, используя только функцию «WithArgs ()», и он работает для меня:)

mocket.Catcher.NewMock (). WithArgs ( "АСМАП", "envtypes"). WithReply (commonReply)

...