gpt4 book ai didi

typescript - 如何在 NestJS 中对 TypeORM 的自定义存储库进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 16:01:38 27 4
gpt4 key购买 nike

要测试的类

我的 TypeORM 存储库 extends AbstractRepository :

@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)

所以,我的问题是,如何模拟 repositoryrepository.findOne

换句话说,我如何模拟从 AbstractRepository 继承的字段?这是protected并且无法从 UsersRepository 访问实例?

有一个similar question here但它用于从 Repository<Entity> 延伸而不是 AbstractRepository<Entity> .他们能够模拟 findOne因为它是public .


我尝试了什么

我尝试以 NestJS 推荐的方式模拟它,但这是针对非自定义存储库的,在我的情况下不起作用:

{
provide: getRepositoryToken(User),
useValue: {
findOne: jest.fn().mockResolvedValue(new User())
}
}

最佳答案

我选择了内存数据库解决方案。这样我就不必模拟 TypeORM 的复杂查询。单元测试在不影响真实数据库的情况下运行得一样快。

我的生产数据库是 PostgreSQL,但我可以使用 SQLite 内存数据库进行单元测试。这是可行的,因为 TypeORM 提供了对数据库的抽象。只要我们满足存储库的接口(interface),我们在后台使用什么数据库并不重要。

我的测试是这样的:

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)
})
})
})

关于typescript - 如何在 NestJS 中对 TypeORM 的自定义存储库进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70521273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com