NestJS 和 Jest:Nest 无法解析 UserService 的依赖关系
NestJS and Jest: Nest can't resolve dependencies of the UserService
我正在使用 NestJS + MikroORM 堆栈并尝试使用 Jest 编写测试。
在 user.service.spec.ts
上,我总是收到以下错误:
Nest can't resolve dependencies of the UserService (?). Please make sure that the argument UserRepository at index [0] is available in the RootTestModule context
user.service.spec.ts
:
describe('UserService', () => {
let userService: UserService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserService,
{
provide: getRepositoryToken(User),
useValue: {
find: jest.fn().mockResolvedValue([]),
findOneOrFail: jest.fn().mockResolvedValue({}),
create: jest.fn().mockReturnValue({}),
save: jest.fn(),
update: jest.fn().mockResolvedValue(true),
delete: jest.fn().mockResolvedValue(true),
},
},
],
}).compile();
userService = module.get<UserService>(UserService);
});
it('should be defined with dependencies', () => {
expect(userService).toBeDefined();
});
});
user.repository.ts
:
@Repository(User)
export class UserRepository extends EntityRepository<User> {}
为什么会这样?根据所有其他教程,它应该可以工作。谢谢。
如果您的 UserService
的构造函数有
private readonly repo: UserRepository
那么你应该使用 provide: UserRepository
因为现在你的提供商的令牌是 class 引用,而不是它的名称。
Nest 8 改变了 DI 的工作方式,它以前使用字符串标记,但现在它使用 class 引用代替。嵌套 MikroORM 适配器确实为自定义存储库注册了字符串标记和 class 引用。这里是您自己注册存储库,所以您要么需要两种方式都注册它,要么至少按照您使用的方式进行注册。
通过类型导入需要class引用方式。通过 @InjectRepository()
导入需要字符串标记。 forFeature()
调用注册它们,以防实体有自定义存储库 class。
因此,要么按照其他答案中的建议添加 provide: UserRepository
,要么使用 @InjectRepository()
装饰器。
我正在使用 NestJS + MikroORM 堆栈并尝试使用 Jest 编写测试。
在 user.service.spec.ts
上,我总是收到以下错误:
Nest can't resolve dependencies of the UserService (?). Please make sure that the argument UserRepository at index [0] is available in the RootTestModule context
user.service.spec.ts
:
describe('UserService', () => {
let userService: UserService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserService,
{
provide: getRepositoryToken(User),
useValue: {
find: jest.fn().mockResolvedValue([]),
findOneOrFail: jest.fn().mockResolvedValue({}),
create: jest.fn().mockReturnValue({}),
save: jest.fn(),
update: jest.fn().mockResolvedValue(true),
delete: jest.fn().mockResolvedValue(true),
},
},
],
}).compile();
userService = module.get<UserService>(UserService);
});
it('should be defined with dependencies', () => {
expect(userService).toBeDefined();
});
});
user.repository.ts
:
@Repository(User)
export class UserRepository extends EntityRepository<User> {}
为什么会这样?根据所有其他教程,它应该可以工作。谢谢。
如果您的 UserService
的构造函数有
private readonly repo: UserRepository
那么你应该使用 provide: UserRepository
因为现在你的提供商的令牌是 class 引用,而不是它的名称。
Nest 8 改变了 DI 的工作方式,它以前使用字符串标记,但现在它使用 class 引用代替。嵌套 MikroORM 适配器确实为自定义存储库注册了字符串标记和 class 引用。这里是您自己注册存储库,所以您要么需要两种方式都注册它,要么至少按照您使用的方式进行注册。
通过类型导入需要class引用方式。通过 @InjectRepository()
导入需要字符串标记。 forFeature()
调用注册它们,以防实体有自定义存储库 class。
因此,要么按照其他答案中的建议添加 provide: UserRepository
,要么使用 @InjectRepository()
装饰器。