[英]Can I test queries in goroutine with sqlmock?
我的应用程序中有这段代码,我使用 goroutine 因为查询非常慢。 代码工作正常,但我一直在尝试用 sqlmock 测试 function 并且有很多误报和很多困难,我该怎么做才能使用 sqlmock 测试这些查询? (Obs:我用过 postgres)
func(r repository) Queries(ctx context.Context) (*models.MyModel, error) {
var users int64
var services int64
var sells int64
queryReponses := make(chan *gorm.DB, 3)
go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM deposits").Find(&users)
}()
go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM services").Find(&users)
}()
go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM sells").Find(&users)
}()
for i := 0; i < 3; i += 1 {
queryResponse := <-queryReponses
if queryResponse.Error != nil {
return &models.MyModel{}, fmt.Errorf(queryResponse.Error)
}
}
return &models.MyModel{
Users: users,
Services: services,
Sells: sells,
}
}
您同时修改相同的值,使用-race
检测器标志运行测试以检测它
go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM deposits").Find(&users)
}()
- go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM services").Find(&users)
+ go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM services").Find(&services)
}()
- go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM sells").Find(&users)
}()
+ go func(){
queryResponses <- r.db.Raw("SELECT COUNT(*) FROM sells").Find(&sells)
}()
同样对于这种情况, sync/errgroup使用起来更方便:
var g errgroup.Group
g.Go(func() error {
return r.db.Raw("SELECT COUNT(*) FROM deposits").Find(&users).Error
})
g.Go(func() error {
return r.db.Raw("SELECT COUNT(*) FROM services").Find(&services).Error
})
if err := g.Wait(); err == nil {
return &models.MyModel{}, fmt.Errorf(queryResponse.Error)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.