📜  nestjs 测试数据库 - Javascript (1)

📅  最后修改于: 2023-12-03 15:17:51.179000             🧑  作者: Mango

NestJS 测试数据库 - Javascript

在 NestJS 中,我们可以使用各种数据库来存储和管理数据。为了保证数据库的正确性和可靠性,我们需要对数据库进行测试。

在本文中,我们将介绍如何使用 Jest 和 TypeORM 来测试 NestJS 中的数据库。为了方便起见,我们假定您已经熟悉 Jest 和 TypeORM 的基本概念。

安装 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 中的数据库。我们创建了一些测试用例,这些用例可以检查数据库的正确性和可靠性。如果您有任何疑问或建议,请在评论区留言。