如何使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)函数来创建进行此测试的客户端。我为我的问题举了一个坏例子。