【发布时间】:2022-01-17 20:14:01
【问题描述】:
要测试的类
我的 TypeORM 存储库extendsAbstractRepository:
@EntityRepository(User)
export class UsersRepository extends AbstractRepository<User> {
async findByEmail(email: string): Promise<User> {
return await this.repository.findOne({ email })
}
}
单元测试
describe('UsersRepository', () => {
let usersRepository: UsersRepository
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [UsersRepository]
}).compile()
usersRepository = module.get<UsersRepository>(UsersRepository)
})
describe('findByEmail', () => {
it(`should return the user when the user exists in database.`, async () => {
const fetchedUser = await usersRepository.findByEmail('test1@test.com')
})
})
})
在这里,我得到了错误:
TypeError: Cannot read property 'getRepository' of undefined
at UsersRepository.get (repository/AbstractRepository.ts:43:29)
at UsersRepository.findByEmail (users/users.repository.ts:11:23)
at Object.<anonymous> (users/users.repository.spec.ts:55:49)
所以,我的问题是,如何模拟 repository 或 repository.findOne?
换句话说,我如何模拟从AbstractRepository 继承的字段,它们是protected,并且不能从UsersRepository 实例访问?
有一个similar question here,但它用于从Repository<Entity> 扩展而不是AbstractRepository<Entity>。他们能够模拟findOne,因为它是public。
我尝试了什么
我尝试以 NestJS 推荐的方式模拟它,但这是针对非自定义存储库的,在我的情况下不起作用:
{
provide: getRepositoryToken(User),
useValue: {
findOne: jest.fn().mockResolvedValue(new User())
}
}
【问题讨论】:
标签: typescript unit-testing jestjs nestjs typeorm