我用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 种策略:
- 删除您在测试中创建的数据。
当我因其他原因希望数据库继续工作时,我会使用此策略。在清理步骤中,识别测试数据并将其删除。这需要按顺序完成,因为正如您所指出的,外键。我有一个核心对象(device
),当它们由测试创建时,有一个标识符(device.name,如“UnitTest%”) - 我删除所有依赖记录,然后删除所有
基于该标识符的设备记录。
- 按相反顺序删除所有表格
既然你很乐意放弃 table ,你就可以这么做。您只需按顺序执行它们,这样就不会发生外键违规。
- 批量删除/复制数据库文件。
这可能会更困难,因为您需要确保没有事件的数据库连接。但 Sqlite 是一个基于文件的数据库,因此如果没有事件连接,那么您可以删除该文件。要么完全删除它(这意味着您需要能够再次创建它),要么在测试套件可用的地方有一个空的,然后将其复制进去。
关于nestjs - 在测试之间删除 SqLite DB NestJs、TypeOrm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72383277/