首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为单元测试模拟DB

如何为单元测试模拟DB
EN

Stack Overflow用户
提问于 2021-07-19 11:47:47
回答 1查看 1.7K关注 0票数 0

我有这样的UserRepo:

代码语言:javascript
运行
复制
type users struct {
   *gorm.DB
}

func NewMySqlUsersRepository(db *gorm.DB) repository.IUsers {
    return &users{
        DB: db,
    }
}

相应方法实现

代码语言:javascript
运行
复制
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中,如何模拟其他数据库查询?

EN

回答 1

Stack Overflow用户

发布于 2021-07-19 13:28:29

嘲笑围棋是关于围棋接口的。您必须为存储库创建一个接口,并实现interface方法。

代码语言:javascript
运行
复制
type interface IUserRepository{
     save(user *UserModel) (*userModel, Err)
}

现在,您需要做的就是与用户结构一起创建一个模拟结构。这两个结构都将实现IUserRepository。您还可能希望使用流行的模拟/测试框架(如去-模拟作证 )来创建模拟。

现在,您必须实现一个工厂方法,这样它将根据条件返回mockStruct。您可以使用上下文、env变量或任何其他方式注入条件变量。

代码语言:javascript
运行
复制
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,
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68439982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档