Yog*_*ity 2 unit-testing typescript jestjs typeorm nestjs
我的 TypeORM 存储库extends AbstractRepository:
@EntityRepository(User)
export class UsersRepository extends AbstractRepository<User> {
async findByEmail(email: string): Promise<User> {
return await this.repository.findOne({ email })
}
}
Run Code Online (Sandbox Code Playgroud)
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')
})
})
})
Run Code Online (Sandbox Code Playgroud)
在这里,我收到错误:
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)
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,我如何模拟repositoryor repository.findOne?
换句话说,我如何模拟从实例继承AbstractRepository且protected无法从实例访问的字段UsersRepository?
这里有一个类似的问题,但它是从 扩展Repository<Entity>而不是AbstractRepository<Entity>。他们能够嘲笑,findOne因为它是public。
我尝试以 NestJS 推荐的方式模拟它,但这适用于非自定义存储库,在我的情况下不起作用:
{
provide: getRepositoryToken(User),
useValue: {
findOne: jest.fn().mockResolvedValue(new User())
}
}
Run Code Online (Sandbox Code Playgroud)
我选择了内存数据库解决方案。这样我就不必模拟 TypeORM 的复杂查询。单元测试运行得同样快,而无需访问真实的数据库。
我的生产数据库是 PostgreSQL,但我可以使用 SQLite 内存数据库进行单元测试。这是可行的,因为 TypeORM 提供了对数据库的抽象。只要我们满足存储库的接口,我们在后台使用什么数据库并不重要。
我的测试如下所示:
const testConnection = 'testConnection'
describe('UsersRepository', () => {
let usersRepository: UsersRepository
beforeEach(async () => {
const connection = await createConnection({
type: 'sqlite',
database: ':memory:',
dropSchema: true,
entities: [User],
synchronize: true,
logging: false,
name: testConnection
})
usersRepository = connection.getCustomRepository(UsersRepository)
})
afterEach(async () => {
await getConnection(testConnection).close()
})
describe('findByEmail', () => {
it(`should return the user when the user exists in database.`, async () => {
await usersRepository.createAndSave(testUser)
const fetchedUser = await usersRepository.findByEmail(testUser.email)
expect(fetchedUser.email).toEqual(testUser.email)
})
})
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8821 次 |
| 最近记录: |