用go-mocket模拟GORM数据库不起作用

时间:2019-07-11 07:50:18

标签: go mocking go-gorm mockups

我正在尝试使用go-mocket模拟gorm db,但无法正常工作。我没有向我的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
}

我的测试功能:

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(“数据库中已经存在一条记录:”)

但是我从来没有从ClusterExists函数收到“ true”,因此,我无法使测试失败。

您知道我在Go-Mocket上做错什么吗?有什么我想念的吗?

亲切的问候!

1 个答案:

答案 0 :(得分:0)

已修复!

我只使用了'WithArgs()'函数来匹配查询,并且对我有用:)

mocket.Catcher.NewMock()。WithArgs(“ testname”,“ envtypes”)。WithReply(commonReply)

相关问题