尝试进行单元测试。 出现以下错误:
TypeError:无法读取未定义的属性“ prototype”
导出类UserService {
constructor(@InjectRepository(User)私有只读userRepository: 存储库<用户>){}
规格:
[1]
有人可以分享解决方案吗?
更多信息:
describe('AuthController', () => {
let authController: AuthController;
let authService: AuthService;
let mockRepository = {
};
beforeEach(async () => {
const module = await Test.createTestingModule({
imports: [
TypeOrmModule.forFeature([User]),
],
controllers: [AuthController],
providers: [AuthService, {
provide: getRepositoryToken(User),
useValue: mockRepository
}]
}).compile()
authService = module.get<AuthService>(AuthService);
authController = module.get<AuthController>(AuthController)
});
似乎有问题
typeorm
使用此代码,我将得到完全相同的错误。因此,唯一的问题是将beforeEach(async () => {
const module = await Test.createTestingModule({
}).compile()
authService = module.get<AuthService>(AuthService);
authController = module.get<AuthController>(AuthController)
});
添加到该测试模块中。
因此它由于依赖关系而失败: AuthController-> AuthService-> UserService-> TypeORM
顺便说一句,刚刚使用Postman的API检查了typeorm
,它工作正常。
仍然没有结果:
UserService
也
module = await Test.createTestingModule({
controllers: [AuthController],
components: [
{
provide: AuthService,
useValue: {}
},
{
provide: UserService,
useValue: {}
},
{
provide: getRepositoryToken(User),
useValue: {}
}
],
providers: [
{
provide: AuthService,
useValue: {}
},
{
provide: UserService,
useValue: {}
},
{
provide: getRepositoryToken(User),
useValue: {}
}
]
}).compile()
this.authController = module.get<AuthController>(AuthController)
答案 0 :(得分:1)
我查看了您在Kim Kern(https://github.com/rankery/wof-server)的评论中提供的项目
您正在使用桶文件(src/user/index.ts
),导出UserModule
export * from './user.module';
我猜您稍后将使用此桶文件来导入模块。
现在,每次导入barrel文件的内容时,都会执行src/user/user.module.ts
构建版本中包含的代码,其中包括UserModule
类的修饰,而该修饰将依次让Typeorm尝试构建一个导致错误的存储库。
您应该从src/user/index.ts
中删除此导出(或简单地删除文件),并修复由该删除导致的导入损坏,它应该可以工作。
答案 1 :(得分:1)
我花了好几个小时才弄明白,它确实有效
async findAll() {
return await this.userRepository.createCursor(this.userRepository.find()).toArray();
}
答案 2 :(得分:0)
我刚刚将User实体传递给存储库,并且它可以正常工作。
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>
) { }
}
从此处结帐文档:https://docs.nestjs.com/techniques/database。他们有很好的文档。
答案 3 :(得分:0)
导入TypeOrmModule.forFeature(...)
时,还必须导入TypeOrmModule.forRoot(...)
。但是在单元测试中,您可能不想使用数据库,而是模拟出所有依赖项。
您的控制器不应直接访问数据库,这就是服务的目的。因此,如果要测试控制器并且仅注入服务,则应仅声明AuthService
模拟,而不导入任何内容:
const module = await Test.createTestingModule({
controllers: [AuthController],
providers: [{
provide: AuthService,
useValue: authServiceMock
}]
}).compile()
如果您要测试AuthService
,并且仅注入存储库,则声明您的ockMockRepository,并忽略其他所有内容。