You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:05:21