使用 @InjectRepository 时测试失败:Nest 无法解析存储库

i.b*_*rod 6 javascript dependency-injection typescript nestjs

我正在使用 NestJs 和 Typeorm,正常设置。UsersService 获取注入的 Typeorm 存储库:

constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
Run Code Online (Sandbox Code Playgroud)

在用户模块中:

@Module({
  imports:[ TypeOrmModule.forFeature([User])],
  controllers: [UsersController ],
  providers: [UsersService]
})
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,没有什么特别的。但无论我做什么,自动生成的 UsersService 测试都会失败:

describe('UsersService', () => {
  let service: UsersService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [UsersService],      
    }).compile();

    service = module.get<UsersService>(UsersService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Nest 无法解析 UsersService 的依赖关系(?)。请确保索引 [0] 处的参数 UserRepository 在 RootTestModule 上下文中可用。

我发现 Stackoverflow 上的解决方案似乎已经过时,或者过于复杂。我知道问题源于 @InjectRepository 的使用。

解决办法是什么?我尝试下载其他人相当相似的项目,并得到相同的错误!均带有巢穴 8 和巢穴 7。

小智 9

Nest 无法解析依赖关系,因为您没有在测试模块中提供存储库。如果您正在进行单元测试,您可能想使用自定义提供程序来模拟存储库:

 import { getRepositoryToken } from '@nestjs/typeorm';

 describe('UsersService', () => {
   let service: UsersService;
   let repository: Repository<User>;

   beforeEach(async () => {
     const module: TestingModule = await Test.createTestingModule({
       providers: [
         UsersService,
         {
           provide: getRepositoryToken(User),
           useValue: {},
         }
       ],      
     }).compile();

     service = module.get<UsersService>(UsersService);
   });

   it('should be defined', () => {
     expect(service).toBeDefined();
   });
})
Run Code Online (Sandbox Code Playgroud)

您可以提供对象、类或工厂函数,更多详细信息请参阅文档: https: //docs.nestjs.com/fundamentals/custom-providers

然后在您的测试中,您可以这样模拟存储库的方法:

jest.spyOn(repository, 'find').mockResolvedValueOnce([])
Run Code Online (Sandbox Code Playgroud)

这不是唯一的模拟方法,但这是一种简单且标准的方法。


Mic*_*evi 3

该文档非常清楚如何在使用时编写测试@nestjs/typeorm: https: //docs.nestjs.com/techniques/database#testing

这里还有很多示例:https://github.com/jmcdo29/testing-nestjs