登录
首页 >  Golang >  Go问答

如何模拟数据库进行单元测试

来源:stackoverflow

时间:2024-04-05 13:12:35 171浏览 收藏

今天golang学习网给大家带来了《如何模拟数据库进行单元测试》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我有这样的 userrepo:

type users struct {
   *gorm.db
}

func newmysqlusersrepository(db *gorm.db) repository.iusers {
    return &users{
        db: db,
    }
}

对应方法实现

func (r *users) Save(user *domain.User) (*domain.User, *errors.RestErr) {
  err := r.DB.Model(&domain.User{}).Create(&user).Error

  if err != nil {
    logger.Error("error occurred when create user", err)
    return nil, errors.NewInternalServerError(errors.ErrSomethingWentWrong)
  }

  return user, nil
}

对于数据库模拟,我使用 sqlmock。但是我如何模拟这个方法进行单元测试呢?在 gorm 中如何模拟其他数据库查询?


正确答案


go 中的模拟都是关于 go 接口的。您必须为存储库创建一个接口并实现接口方法。

type interface iuserrepository{
     save(user *usermodel) (*usermodel, err)
}

现在您需要做的就是创建一个模拟结构以及用户结构。这两个结构都将实现 iuserrepository。您可能还想使用流行的模拟/测试框架(例如 go-mocktestify)来创建模拟。

现在,您必须实现一个工厂方法,以便根据条件返回mockstruct。您可以使用上下文、环境变量或任何其他方式注入条件变量。

func NewMySqlUsersRepositoryFactory(ctx context.Context, env string, db *gorm.DB) repository.IUsers {
    if env == "test" {
        // This is a mocked struct ...
        return mock.MockUsers{}
    }
     // This is a actual struct... 
    return &users{
        DB: db,
    }
}

今天关于《如何模拟数据库进行单元测试》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>