如何使sqlmock永不返回错误?

如何使sqlmock永不返回错误?,sql,database,testing,go,mocking,Sql,Database,Testing,Go,Mocking,我不能测试任意使用数据库的函数NewDao。我想检查返回的Dao是否既没有nil客户机也没有nil产品 类型Dao结构{ 客户端客户端 产品 } func(d*Dao)ClientDao()客户端{ 返回d.client } func(d*Dao)Product()ProductDao{ 返回d产品 } func NewDao(db*sql.db)(*Dao,错误){ 如果db==nil{ 返回nil,errors.New(“无法从nil数据库创建dao”) } client,err:=newC

我不能测试任意使用数据库的函数
NewDao
。我想检查返回的Dao是否既没有nil客户机也没有nil产品

类型Dao结构{
客户端客户端
产品
}
func(d*Dao)ClientDao()客户端{
返回d.client
}
func(d*Dao)Product()ProductDao{
返回d产品
}
func NewDao(db*sql.db)(*Dao,错误){
如果db==nil{
返回nil,errors.New(“无法从nil数据库创建dao”)
}
client,err:=newClientDao(db)//任意使用db
如果错误!=零{
返回零,错误
}
product,err:=newProductDao(db)//任意使用db
如果错误!=零{
返回零,错误
}
return&Dao{client,product},nil
}
我使用sqlmock测试
NewDao()
,但总是失败,因为我不知道mock需要期望什么

func TestNewDao(t*testing.t){
db,mock,err:=sqlmock.New()
如果错误!=零{
t、 致命(“无法为测试dao创建数据库”)
}
//如何设置mock以期望任何事情并且永不失败?
//mock.ExpectQuery(任何)?
dao,err:=NewDao(db)
//错误永远不会是零,因为mock没有期望
如果错误!=零{
t、 致命(“无法为测试dao创建dao。用户%q”,错误)
}
如果dao.User()==nil{
t、 Fatalf(“用户dao为零”)
}
如果dao.Client()==nil{
t、 Fatalf(“客户dao为零”)
}
}


有人知道如何存根sqlmock以达到我的目的吗?或者可以指定sqlmock lib的替代品?

您在
NewDao
中的上一次返回中缺少第二项:

return&Dao{client,product}

应该是:

return&Dao{client,product},nil


Return语句必须“返回”函数头中声明的所有内容。

您的
Dao.Client
Dao.Product
方法本身不调用任何依赖项,因此您无需模拟。使用模拟来测试这两种方法是没有意义的

尽管像这样测试一行程序可能不是最明智的做法,但是如果您想测试它们,您只需要确保它们返回的值等于它们应该返回的字段的值

func TestDaoClient(t *testing.T) {
    var client ClientDao // TODO: prepare a client dao value for test

    tests := []struct{
        name string
        dao *Dao
        want ClientDao
    }{{
        name: "should return client dao",
        dao: &Dao{client: client},
        want: client,
    }, {
        name: "should return nil",
        dao: &Dao{client: nil},
        want: nil,
    }}

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := tt.dao.Client(); !reflect.DeepEqual(got, tt.want) {
                t.Errorf("client got=%v, want=%v", got, tt.want)
            }
        })    
    }
}

现在,您可以对
Dao.Product
方法执行相同的操作。

我想要的是找到一种方法,使测试不依赖于UserDao实现,它任意使用db。明白了!谢谢我不需要使用newClientDao(db)函数来创建进行此测试的客户端。我为我的问题举了一个坏例子。