Ошибка углового модульного теста: для компонента не найдена фабрика компонентов.Вы добавили его в @ NgModule.entryComponents - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь научиться кодировать с помощью Angular, и у меня возникла проблема.Я создаю приложение для себя, и я только что реализовал Angular Material Dialog.Я положил это в сервис обертки, и все, кажется, хорошо.Поэтому в компоненте, который я вызываю Wrapper Service, чтобы вызвать модальное состояние, например ...

public assignInstrument(instrument: any): void {
    this.modalDialogWrapperService.openAssignmentWindow({
        product: 'instrument',
        type: instrument.type,
        serial: instrument.serial,
        id: instrument.id
  });
}

метод службы выглядит так: обратите внимание, я передаю имя компонента, который я хочу вызвать в модальном окне

openAssignmentWindow(instrument) {
    const dialogRef = this.dialog.open(ChangeAssignmentComponent, {
        data: instrument,
        width: '693px',
        height: '498px'
        });
    dialogRef.afterClosed().subscribe(() => {});
    });
}

Все отлично работает!Но, как хороший разработчик, я должен написать модульные тесты ... поэтому для тестирования моего компонента у меня есть следующий тест (я включил, как я высмеиваю Сервис и некоторый другой код, чтобы создать впечатление о тестовом файле)

let modalDialogWrapperServiceSpy: jasmine.SpyObj<ModalDialogWrapperService>;
    const mockModalDialogWrapperService = jasmine.createSpyObj('ModalDialogWrapperService', ['openAssignmentWindow']);
    mockModalDialogWrapperService.openAssignmentWindow.and.returnValue({});

TestBed.configureTestingModule({
    imports: [...],
    declarations: [...],
    providers: [{
      provide: ModalDialogWrapperService,
      useValue: mockModalDialogWrapperService
    }]
}).compileComponents();

beforeEach(() => {
    fixture = TestBed.createComponent(InstrumentsPageComponent);
    modalDialogWrapperServiceSpy = TestBed.get(ModalDialogWrapperService);
    component = fixture.componentInstance;
    fixture.detectChanges();
 })

describe('assignInstrument', () => {
  it('should call the Modal Dialog Service', () => {
    component.assignInstrument({});
    expect(modalDialogWrapperServiceSpy.openAssignmentWindow).toHaveBeenCalledTimes(1);
  });
});

Этот тест не пройден!С ошибкой «Ошибка: не найдена фабрика компонентов для ChangeAssignmentComponent. Вы добавили ее в @ NgModule.entryComponents» - это кажется странным, так как в моем файле app.module я объявляю «ChangeAssignmentComponent» в элементах entryComponents и объявлениях массивов?Я в замешательстве - кто-нибудь знает, что я могу делать не так?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

есть два места, в которых это должно быть сделано .... компоненты ввода, а также в объявлениях (при настройке модуля тестирования) ....

  TestBed
  .configureTestingModule({
              declarations: [YourComponent],
   })
  .overrideModule(BrowserDynamicTestingModule, { set: { entryComponents: [YourComponent] } });
0 голосов
/ 04 марта 2019

Testintg сомневается.

Более серьезно, позвольте мне ответить вам.

В Angular ваши компоненты обрабатываются модулем.Когда вы используете диалоги материалов и закуски, вы фактически используете функцию CDK, которая называется Portal.Это позволит вам создавать ваши компоненты динамически.

Но когда вы это сделаете, вы должны добавить их в entryComponents вашего модуля.Вы сделали это в своем модуле, так что вы должны также сделать это в своих тестах.

Синтаксис

TestBed
  .configureTestingModule(...)
  .overrideModule(BrowserDynamicTestingModule, { set: { entryComponents: [YourComponent] } });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...