【问题标题】:How to mock DB for unit tests如何模拟 DB 进行单元测试
【发布时间】:2021-09-27 02:05:16
【问题描述】:

我有这样的 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 中如何模拟其他数据库查询?

【问题讨论】:

    标签: mysql unit-testing go mocking go-gorm


    【解决方案1】:

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

    type interface IUserRepository{
         save(user *UserModel) (*userModel, Err)
    }
    

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

    现在,您必须实现一个工厂方法,以便它根据条件返回 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,
        }
    }
    

    【讨论】:

    • 我在同一行写了一篇博客。你可能想看看这个。 link
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多