如何使用Drivine与NestJS创建测试数据并正确获取PersistenceManager?
正确获取PersistenceManager的两种方案
方案一:在测试类中直接依赖注入(推荐)
和业务代码的写法保持一致,在测试类里用@InjectPersistenceManager()注解注入PersistenceManager,完全贴合NestJS依赖注入规范,不用硬编码内部token:
import { Test, TestingModule } from '@nestjs/testing'; import { InjectPersistenceManager, PersistenceManager } from '@liberation-data/drivine'; import { RunWithDrivine } from '@liberation-data/drivine/testing'; import { AppModule } from '../src/app.module'; @RunWithDrivine() describe('YourRepositoryTest', () => { let app: TestingModule; @InjectPersistenceManager() private readonly persistenceManager: PersistenceManager; beforeAll(async () => { app = await Test.createTestingModule({ imports: [AppModule], }).compile(); await app.init(); // 用注入的实例初始化测试数据 await this.persistenceManager.query(`CREATE (u:User {id: '1', name: 'Test User'})`); }); afterAll(async () => { await app.close(); }); // 测试用例编写... });
方案二:通过模块初始化Provider自动执行数据初始化
如果需要在测试模块启动时自动完成数据初始化,可以创建一个专门的初始化Provider,在其中注入PersistenceManager并执行初始化逻辑:
// 定义测试数据初始化Provider export const TestDataInitializer = { provide: 'TEST_DATA_INITIALIZER', useFactory: async (pm: PersistenceManager) => { // 执行数据初始化操作 await pm.query(`CREATE (u:User {id: '1', name: 'Test User'})`); return 'initialized'; }, inject: [PersistenceManager], }; // 测试类中使用 @RunWithDrivine() describe('YourRepositoryTest', () => { let app: TestingModule; beforeAll(async () => { app = await Test.createTestingModule({ imports: [AppModule], providers: [TestDataInitializer], }).compile(); await app.init(); // 模块启动时,初始化逻辑已自动执行 }); // ...测试用例 });
为什么不推荐硬编码token的方式
你之前用app.get("PersistenceManager:default")的方式虽然能运行,但存在两个明显问题:
- 依赖Drivine内部的命名规则,一旦框架调整token格式,代码会直接失效;
- 违背NestJS依赖注入的设计理念,代码可读性和可维护性较差。
上面两种方案都遵循了依赖注入规范,更优雅也更稳定。
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

