如何正确定义gorm db接口?

时间:2016-04-23 21:18:54

标签: go go-gorm

我正在尝试使用类型*gorm.DB的单元测试方法,并且很好奇如何正确定义一个接口,使我能够在不命中数据库的情况下进行测试。

以下是我想要做的一个小例子:

type DBProxy interface {
    Create(values interface{}) *DBProxy
    Update(values interface{}) *DBProxy
}

type TestDB struct{}

func (t *TestDB) Create(values interface{}) *TestDB {
    return t
}

func (t *TestDB) Update(values interface{}) *TestDB {
    return t
}

func Connect() DBProxy {
    return &TestDB{}
}

结果是:

cannot use TestDB literal (type *TestDB) as type DBProxy in return argument:
    *TestDB does not implement DBProxy (wrong type for Create method)
            have Create(interface {}) *TestDB
            want Create(interface {}) *DBProxy

任何帮助将不胜感激!

更新

这是我的实际应用代码:

package database

import (
    "log"
    "os"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

type DBProxy interface {
    Create(values interface{}) DBProxy
    Update(values interface{}) DBProxy
}

func Connect() DBProxy {
    databaseUrl := os.Getenv("DATABASE_URL")

    db, err := gorm.Open("postgres", databaseUrl)

    if err != nil {
        log.Fatal(err)
    }

    return db
}

结果是:

cannot use db (type *gorm.DB) as type DBProxy in return argument:
    *gorm.DB does not implement DBProxy (wrong type for Create method)
            have Create(interface {}) *gorm.DB
            want Create(interface {}) DBProxy

1 个答案:

答案 0 :(得分:1)

TestDB方法必须返回*DBProxy才能实现DBProxy

func (t *TestDB) Create(values interface{}) *DBProxy {
    return t
}
func (t *TestDB) Update(values interface{}) *DBProxy {
    return t
}

稍后你需要断言CreatedDBProxy.(TestDB)