📅  最后修改于: 2023-12-03 15:17:51.179000             🧑  作者: Mango
在 NestJS 中,我们可以使用各种数据库来存储和管理数据。为了保证数据库的正确性和可靠性,我们需要对数据库进行测试。
在本文中,我们将介绍如何使用 Jest 和 TypeORM 来测试 NestJS 中的数据库。为了方便起见,我们假定您已经熟悉 Jest 和 TypeORM 的基本概念。
首先,我们需要安装 Jest 和 TypeORM。
npm install --save-dev jest typeorm @nestjs/testing
在测试数据库之前,我们需要创建一些测试用的数据。这些数据可以通过 TypeORM 的实体来定义和生成。
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
接下来,我们可以编写一个数据工厂来创建一些测试用的用户数据。
import { Factory, Seeder } from 'typeorm-seeding';
import { Connection } from 'typeorm';
import { User } from './user.entity';
export default class CreateUsers implements Seeder {
public async run(factory: Factory, connection: Connection): Promise<void> {
await factory(User)().createMany(5);
}
}
在这里,我们使用 TypeORM 的 Factories 和 Seeders 插件来生成测试数据。
在测试之前,我们需要创建一个 TypeORM 的连接来连接数据库。我们可以在 beforeAll
函数中创建连接。
import { Test, TestingModule } from '@nestjs/testing';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
import { User } from './user.entity';
describe('UserRepository', () => {
let connection: Connection;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
TypeOrmModule.forRoot({
type: 'sqlite',
database: ':memory:',
entities: [User],
synchronize: true,
}),
TypeOrmModule.forFeature([User]),
],
}).compile();
connection = module.get<Connection>(Connection);
await connection.runMigrations();
});
afterEach(async () => {
await connection.dropDatabase();
await connection.runMigrations();
});
afterAll(async () => {
await connection.close();
});
it('should find all users', async () => {
// test code here
});
it('should create a user', async () => {
// test code here
});
// more tests here
});
在这里,我们使用 TypeOrmModule
来创建连接和实体。在 beforeAll
函数中,我们编译测试模块并获取 Connection
实例,然后运行数据库迁移以创建表。
在每个测试之后,我们清除数据库并再次运行迁移以重置数据库状态。在最后,我们关闭连接以关闭数据库。
现在我们可以开始编写测试了。以下是一些常见的数据库测试用例:
it('should find all users', async () => {
const userRepository = connection.getRepository(User);
const users = await userRepository.find();
expect(users).toHaveLength(5);
});
在这里,我们使用 getRepository
函数 来获取 UserRepository 实例,并调用 find
函数来获取所有用户。
it('should create a user', async () => {
const userRepository = connection.getRepository(User);
const user = userRepository.create({
name: 'test user',
email: 'test@example.com',
});
await userRepository.save(user);
const createdUser = await userRepository.findOne({ name: 'test user' });
expect(createdUser.email).toEqual('test@example.com');
});
在这里,我们使用 getRepository
函数来获取 UserRepository 实例,并使用 create
函数来创建一个新用户。然后,我们调用 save
函数来保存用户,最后使用 findOne
函数来获取用户并验证是否创建。
it('should delete a user', async () => {
const userRepository = connection.getRepository(User);
const user = await userRepository.findOne({ name: 'test user' });
await userRepository.remove(user);
const deletedUser = await userRepository.findOne({ name: 'test user' });
expect(deletedUser).toBeFalsy();
});
在这里,我们使用 findOne
函数来获取用户,然后调用 remove
函数来删除用户。最后,我们再次使用 findOne
函数来验证是否成功删除。
在本文中,我们介绍了如何使用 Jest 和 TypeORM 来测试 NestJS 中的数据库。我们创建了一些测试用例,这些用例可以检查数据库的正确性和可靠性。如果您有任何疑问或建议,请在评论区留言。