繁体   English   中英

我可以使用 sqlmock 在 goroutine 中测试查询吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM