NestJS TypeORM InjectRepository无法读取未定义的属性“ prototype”

时间:2019-03-05 19:05:05

标签: typescript jestjs nestjs typeorm

尝试进行单元测试。 出现以下错误:

  

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)

4 个答案:

答案 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,并忽略其他所有内容。