nestjs - 在测试之间删除 SqLite DB NestJs、TypeOrm

标签 nestjs typeorm

我用nestJs和jest编写了以下集成测试:

import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken, TypeOrmModule } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { RefreshTokenEntity } from '../refresh-token/refresh-token.entity';
import { UserEntity } from './user.entity';
import { UsersService } from './users.service';

describe('UsersService', () => {
  let service: UsersService;
  let userRepository: Repository<UserEntity>;
  let module: TestingModule;

  beforeAll(async () => {
    module = await Test.createTestingModule({
      imports: [
        TypeOrmModule.forRootAsync({
          useFactory: () => ({
            type: 'better-sqlite3',
            name: 'test-db-sqlite',
            database: ':memory:',
            dropSchema: true,
            entities: [UserEntity, RefreshTokenEntity],
            synchronize: true,
          }),
        }),
        TypeOrmModule.forFeature([UserEntity]),
      ],
      providers: [UsersService],
    }).compile();

    service = module.get<UsersService>(UsersService);
    userRepository = module.get<Repository<UserEntity>>(
      getRepositoryToken(UserEntity),
    );
  });

  it('should find all users', async () => {
    const user1: UserEntity = new UserEntity();
    user1.username = 'test-user';
    user1.password = 'password';
    user1.isActive = true;
    await userRepository.save(user1);

    const users: UserEntity[] = await service.findAll();
    expect(users).toHaveLength(1); // pass
  });

  it('should find no users', async () => {
    const users: UserEntity[] = await service.findAll();
    expect(users).toHaveLength(0); // fail, user is still saved from previous test
  });
});

在每次测试之间,我想将内存数据库恢复到完全干净的状态,我尝试通过 userRepository.query("DROP table users"); 这有效,但它不适用于 future 涉及外键的测试。

提前致谢!

最佳答案

一般来说,我针对此类事情使用了 3 种策略:

  1. 删除您在测试中创建的数据。

当我因其他原因希望数据库继续工作时,我会使用此策略。在清理步骤中,识别测试数据并将其删除。这需要按顺序完成,因为正如您所指出的,外键。我有一个核心对象(device),当它们由测试创建时,有一个标识符(device.name,如“UnitTest%”) - 我删除所有依赖记录,然后删除所有 基于该标识符的设备记录。

  • 按相反顺序删除所有表格
  • 既然你很乐意放弃 table ,你就可以这么做。您只需按顺序执行它们,这样就不会发生外键违规。

  • 批量删除/复制数据库文件。
  • 这可能会更困难,因为您需要确保没有事件的数据库连接。但 Sqlite 是一个基于文件的数据库,因此如果没有事件连接,那么您可以删除该文件。要么完全删除它(这意味着您需要能够再次创建它),要么在测试套件可用的地方有一个空的,然后将其复制进去。

    关于nestjs - 在测试之间删除 SqLite DB NestJs、TypeOrm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72383277/

    相关文章:

    javascript - 在 nestjs 中使用类验证器验证可选参数?

    node.js - 如何从 typeorm 实体中排除列,并且可以选择使用 Find 方法获取该列

    javascript - NestJS 在服务中注入(inject)请求或执行上下文

    typeorm - 为一对一关系创建主键

    javascript - TypeORM M2O O2M关系使用级联插入时外键为空

    typescript - Typeorm 多对多关系 joinColumns

    javascript - Nestjs中如何查询多个@ManyToMany中的数据

    javascript - 如何模拟正在测试的服务调用的函数的实现?

    nestjs - TypeORM 中的多对多连接

    NestJs/类型ORM : How to save Many to Many