将TypeORM存储库注入NestJS服务以进行模拟数据测试

nurikabe:

关于如何在本期中执行此操作的讨论很长时间

我已经尝试了许多建议的解决方案,但运气不佳。

谁能提供一个具体示例,说明如何使用注入的存储库和模拟数据来测试服务?

金·克恩:

假设我们有一个非常简单的服务,该服务通过id查找用户实体:

export class UserService {
  constructor(@InjectRepository(UserEntity) private userRepository: Repository<UserEntity>) {
  }

  async findUser(userId: string): Promise<UserEntity> {
    return this.userRepository.findOne(userId);
  }
}

然后,您可以UserRepository使用以下模拟工厂模拟(根据需要添加更多方法):

// @ts-ignore
export const repositoryMockFactory: () => MockType<Repository<any>> = jest.fn(() => ({
  findOne: jest.fn(entity => entity),
  // ...
}));

使用工厂可确保为每个测试使用新的模拟。

describe('UserService', () => {
  let service: UserService;
  let repositoryMock: MockType<Repository<UserEntity>>;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UserService,
        // Provide your mock instead of the actual repository
        { provide: getRepositoryToken(UserEntity), useFactory: repositoryMockFactory },
      ],
    }).compile();
    service = module.get<UserService>(UserService);
    repositoryMock = module.get(getRepositoryToken(UserEntity));
  });

  it('should find a user', async () => {
    const user = {name: 'Alni', id: '123'};
    // Now you can control the return value of your mock's methods
    repositoryMock.findOne.mockReturnValue(user);
    expect(service.findUser(user.id)).toEqual(user);
    // And make assertions on how often and with what params your mock's methods are called
    expect(repositoryMock.findOne).toHaveBeenCalledWith(user.id);
  });
});

为了类型安全和舒适,您可以在模拟中使用以下类型(远非完美,当笑话本身在即将发布的主要版本中开始使用Typescript时,可能会有更好的解决方案):

export type MockType<T> = {
  [P in keyof T]: jest.Mock<{}>;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将NestJS中的服务注入到typeorm存储库中?

如何使用模拟数据测试AngularJS服务中的功能

在 Spring 项目中进行测试 - 使用 Mockito 将存储库注入服务

NestJS - 将服务注入管道以从数据库中获取

使用模拟数据测试URLSession委托

使用Hive进行数据测试

春季数据测试自定义存储库数据不会更新

Symfony 3.3将存储库注入服务

模拟数据库进行API测试

使用TypeORM和Nestjs进行测试的过程,以及使用模拟玩笑吗?

Spring Boot Controller测试-模拟存储库但测试实际服务

将NestJS与TypeOrm结合使用以在MySQL数据库中进行连接时出现问题

SpyOn TypeORM存储库更改用于单元测试NestJS的返回值

将模拟bean注入spring上下文进行测试

将模拟类注入方法以进行单元测试

将模拟演员注入喷涂路线进行测试

带TypeORM的NestJS:使用自定义存储库时,是否不再需要服务?

针对实际数据库测试NestJS服务

nestjs / TypeOrm数据库事务

Spring MVC测试-在集成测试需要特定类型时注入模拟存储库

单元测试 - 以列表作为数据存储的模拟服务

如何在Visual Studio测试中模拟数据存储库?

将模拟注入AngularJS服务

使用Hilt将存储库注入Android中的服务

模拟AWS服务进行测试

服务中的模拟存储库

Symfony 2.8:在测试控制器中注入模拟存储库

如何在不连接数据库的情况下在 nestjs 和 typeorm 中编写单元测试

SpringBoot测试服务(将存储库与JDBCTemplate结合使用)