【问题标题】:Nest can't resolve dependencies: NettJS Unit testing with TypeORMNest 无法解决依赖关系:NettJS Unit testing with TypeORM
【发布时间】:2021-12-08 13:34:44
【问题描述】:

尝试使用 NestJS 进行单元测试时出现以下错误。

Nest 无法解析 UsersService 的依赖项(UsersRepository、?、UserRoleRepository、RoleRepository、JWTService)。请确保索引 [1] 处的参数 CredentialsRepository 在 RootTestModule 上下文中可用。

测试代码

  describe("UsersService", () => {
  let service: UsersService;
  let repositoryMock: MockType<Repository<Users>>;
  let model: typeof Users;

  let repo: Repository<Users>;
  let userController: UsersController;
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [
        TypeOrmModule.forRoot({
          type: "mysql",
          host: config.db.host,
          port: config.db.port,
          username: config.db.username,
          password: config.db.password,
          database: config.db.database,
          autoLoadEntities: true,
          synchronize: true,
        }),
        CredentialsModule,
      ],
      providers: [
        UsersService,
        CredentialsService,
        AuthService,
        JWTService,
        {
          provide: getRepositoryToken(Users),
          // useValue: {
          //   find: jest.fn(() => [Alluser]),
          // },
          useFactory: repositoryMockFactory,
        },
      ],
    }).compile();

    service = module.get<UsersService>(UsersService);
    repositoryMock = module.get(getRepositoryToken(Users));
  });
  it("User details get by Id", async () => {
    repositoryMock.findOne.mockReturnValue(testUser);
    expect(service.findUser(testUser.id)).toEqual(testUser);
    expect(repositoryMock.findOne).toHaveBeenCalledWith(testUser.id);
    // expect(await service.findOne(1)).toBeCalledWith(testUser);
  });

  // it("All Users details ", async () => {
  //   expect(await service.find()).toEqual([Alluser]);
  // });
  // it('Create new User ', async () => {
  //   expect(await service.createNewUser(createUser)).toEqual(testUser);
  // });
});

【问题讨论】:

  • 因为您正在对UsersService 进行单元测试,所以只有UsersService 服务应该在您的providers 数组中。然后您将拥有{ provide: X, use... } 的每个依赖项(或使用auto mocking 功能)。使用这种方法,您将不会收到此错误。 github.com/jmcdo29/testing-nestjs

标签: nestjs


【解决方案1】:

根据代码,您似乎正在尝试测试“UserService”,但在测试模块中,您还有“CredentialsService”,它依赖于“CredentialsRepository”,并且未被模拟。

providers: [
    UsersService,
    CredentialsService,
    AuthService,
    JWTService,
    {
      provide: getRepositoryToken(Users),
      // useValue: {
      //   find: jest.fn(() => [Alluser]),
      // },
      useFactory: repositoryMockFactory,
    },
  ],

单元测试的基本思想是测试一个代码块,并模拟代码的其他依赖项,在本例中为“CredentialsService、AuthService 和 JWTService”。

如果代码的依赖不被mock,那么真正的依赖代码将被执行,这将调用依赖代码的进一步依赖。

所以为了避免这些情况,你也应该模拟“CredentialsService、AuthService 和 JWTService”服务,就像你对用户服务所做的那样,然后报告的错误就会消失。

首先声明变量

let credentialService: CredentialsService;
let authService: AuthService;
let jwtService: JWTService;

然后在 beforeEach 块中初始化那些依赖的服务

service = module.get<UsersService>(UsersService)
credentialService = module.get<CredentialsService>(CredentialsService)
authService = module.get<AuthService>(AuthService)
jwtService = module.get<JWTService>(JWTService)

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 2021-09-06
    • 1970-01-01
    • 2021-07-28
    • 2023-03-31
    • 1970-01-01
    • 2022-01-17
    • 2018-11-21
    • 2020-03-12
    相关资源
    最近更新 更多