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