тесты не выполняются при введении класса с декоратором - PullRequest
0 голосов
/ 03 октября 2018

Скорее всего, это проблема среды, но у меня проблемы с тестированием внедренных классов, использующих декораторы.

Я надеюсь, что кто-то увидит, что мне не хватает.

Примечание: что когда я запускаю код, он работает нормально.Ошибка возникает только при выполнении шутливых тестов.У меня есть полный набор тестов, который отлично работает.Тест, который не пройден, проходит, когда я удаляю аннотацию декоратора и у меня больше нет класса extension EventEmitter.

. Я также использую ts-node для запуска кода.Я использую ts-node ./node_modules/.bin/jest src/event-emitter-inversify/__tests__/event-emitter-inversify.test.ts

Я не уверен, почему тесты не пройдены, а прогон успешен.

Я последовательно вижу ошибку TypeError: Cannot read property 'constructor' of null в моих тестах.

Здесьэто настройка.

event-emitter-inversify.ts

import 'reflect-metadata';
import { EventEmitter } from 'events';
import { ContainerModule, decorate, injectable, interfaces } from 'inversify';

decorate(injectable(), EventEmitter);

@injectable()
export class EventEmitterChild extends EventEmitter {
  constructor() {
    super();
  }

  greet() {
    console.log('hello world.');
  }
}

export const EventEmitterModule = new ContainerModule(
  (bind: interfaces.Bind) => {
    bind<EventEmitterChild>('EventEmitterChild').to(EventEmitterChild).inSingletonScope();
  }
);

event-emitter-inversify-independent.ts

import { inject, injectable } from 'inversify';
import { EventEmitterChild } from './event-emitter-inversify';

@injectable()
export class EventEmitterDependent {
  constructor(@inject('EventEmitterChild') private readonly _eventEmitterChild: EventEmitterChild) {
  }

  run() {
    this._eventEmitterChild.greet();
  }
}

run.ts (это работает нормально!)

import { Container } from 'inversify';

import { EventEmitterChild, EventEmitterModule } from './event-emiiter-inversify';
import { EventEmitterDependent } from './event-emitter-inversify-dependent';

const referenceContainer = new Container();

referenceContainer.load(EventEmitterModule);

const eventEmitterChild = referenceContainer.get<EventEmitterChild>('EventEmitterChild');
eventEmitterChild.greet();

const eventEmitterDependent = referenceContainer.get<EventEmitterDependent>('EventEmitterDependent');

eventEmitterDependent.run();

event-emitter-inversify.test.ts (это не работает)

import { Container } from 'inversify';

import { EventEmitterChild, EventEmitterModule } from '../event-emitter-inversify';

describe('EventEmitter test', () => {
  const container: Container = new Container();

  beforeAll(async () => {
    container.load(EventEmitterModule);
  });

  test('get EventEmitterChild from container', () => {
    const eventEmitterChild = container.get<EventEmitterChild>('EventEmitterChild');

    expect(eventEmitterChild).toBeDefined();
  });
});

Я запускаю тест с:

ts-node ./node_modules/.bin/jest src/event-emitter-inversify/__tests__/event-emitter-inversify.test.ts

И он не работает с:

TypeError: Cannot read property 'constructor' of null

stacktrace

  at getClassPropsAsTargets (node_modules/inversify/lib/planning/reflection_utils.js:82:75)
  at getClassPropsAsTargets (node_modules/inversify/lib/planning/reflection_utils.js:84:27)
  at getClassPropsAsTargets (node_modules/inversify/lib/planning/reflection_utils.js:84:27)
  at getTargets (node_modules/inversify/lib/planning/reflection_utils.js:28:27)
  at Object.getDependencies (node_modules/inversify/lib/planning/reflection_utils.js:12:19)
  at node_modules/inversify/lib/planning/planner.js:106:51
      at Array.forEach (<anonymous>)
  at _createSubRequests (node_modules/inversify/lib/planning/planner.js:94:20)
  at Object.plan (node_modules/inversify/lib/planning/planner.js:136:9)
  at node_modules/inversify/lib/container/container.js:318:37

Есть идеи, что я пропускаю или делаю неправильно?

...