Тестирование сервиса NestJS на основе актуальной базы данных - PullRequest
1 голос
/ 17 апреля 2019

Я бы хотел иметь возможность протестировать мой сервис Nest на реальной базе данных. Я понимаю, что большинство модульных тестов должны использовать фиктивный объект, но иногда имеет смысл проводить тестирование и против самой базы данных.

Я искал в «Гнездо» вопросы SO и GH и начинаю переходить к завершению всех ответов. : -)

Я пытаюсь работать с https://github.com/nestjs/nest/issues/363#issuecomment-360105413. Ниже приведен мой модульный тест, в котором для передачи хранилища моему классу обслуживания используется пользовательский поставщик.

describe("DepartmentService", () => {
  const token = getRepositoryToken(Department);
  let service: DepartmentService;
  let repo: Repository<Department>;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        DepartmentService,
        {
          provide: token,
          useClass: Repository
        }
      ]
    }).compile();

    service = module.get<DepartmentService>(DepartmentService);
    repo = module.get(token);
  });

Все компилируется правильно, TypeScript кажется счастливым. Однако, когда я пытаюсь выполнить create или save на моем Repository экземпляре, базовый Repository кажется неопределенным. Вот обратная трассировка стека:

TypeError: Cannot read property 'create' of undefined

  at Repository.Object.<anonymous>.Repository.create (repository/Repository.ts:99:29)
  at DepartmentService.<anonymous> (relational/department/department.service.ts:46:53)
  at relational/department/department.service.ts:19:71
  at Object.<anonymous>.__awaiter (relational/department/department.service.ts:15:12)
  at DepartmentService.addDepartment (relational/department/department.service.ts:56:16)
  at Object.<anonymous> (relational/department/test/department.service.spec.ts:46:35)
  at relational/department/test/department.service.spec.ts:7:71

Похоже, что экземпляр EntityManager с классом TypeORM Repository не инициализируется; это ссылка undefined, на которую жалуется эта обратная трассировка.

Как заставить Repository и EntityManager правильно инициализироваться?

спасибо, Том.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Чтобы правильно инициализировать typeorm, вы должны просто иметь возможность импортировать TypeOrmModule в своем тесте:

Test.createTestingModule({
  imports: [
   TypeOrmModule.forRoot({
        type: 'mysql',
        // ...
   }),
   TypeOrmModule.forFeature([Department])
  ]
0 голосов
/ 17 апреля 2019

Вот обновление к тесту, в котором используется предложение Ким Керн.

describe("DepartmentService", () => {
  let service: DepartmentService;
  let repo: Repository<Department>;
  let module: TestingModule;

  beforeAll(async () => {
    module = await Test.createTestingModule({
      imports: [
        TypeOrmModule.forRoot(),
        TypeOrmModule.forFeature([Department])
      ],
      providers: [DepartmentService]
    }).compile();

    service = module.get<DepartmentService>(DepartmentService);
    repo = module.get<Repository<Department>>(getRepositoryToken(Department));
  });

  afterAll(async () => {
    module.close();
  });

  it("should be defined", () => {
    expect(service).toBeDefined();
  });

  // ...
}
...