Nest 无法解析依赖关系:使用 TypeORM 进行 NettJS 单元测试

Nest can't resolve dependencies: NettJS Unit testing with TypeORM

尝试使用 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);
  // });
});

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

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

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

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

因此,为避免这些情况,您还应该模拟“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)