При тестировании компонента, который динамически открывал диалоговое окно с использованием Angular Material (2), я получал ошибку, которую не сразу ожидал. MdDialogModule был добавлен к импорту, поэтому моя TestBed знала, что происходит, но мой динамически загружаемый компонент вызывал проблемы.
Ошибка: ошибка в классе ./AdminHomeComponent AdminHomeComponent - встроенный шаблон: 21: 24, вызванный: Не найдена фабрика компонентов для OfferFormDialogComponent. Вы добавляли его в @ NgModule.entryComponents?
Хорошо, исследование проблемы в Интернете дало мне проблему на Github для репозитория angular. В блоке beforeEach предлагалось следующее:
TestBed.overrideModule(BrowserDynamicTestingModule, { set: { entryComponents: [OfferFormDialogComponent], }, });
Конечно, это решило проблему, но затем во время наших тестов открывается настоящий диалог. Ну, я действительно просто хочу проверить, вызывается ли класс фреймворка. Я не хочу проверять, действительно ли фреймворк выполняет то, что обещает.
Тесты и созданный, но незваный диалог
Оказывается, решение намного чище, если вы просто имитируете, а не вызываете метод MDDialog.
Так что вместо
spyOn(component.dialog, ‘open’).and.callThrough();
we do
//create a mock MdDialogReflet
mockDialogRef = new
MdDialogRef(new
OverlayRef(null,null,null,null),{});
//and give it an empty version of our component. alternatively, a stub mockDialogRef.componentInstance = new
OfferFormDialogComponent(null, null);
spyOn(component.dialog, 'open').and.returnValue(mockDialogRef);
а позже в тестовой спецификации
it('should open the dialog on clicking the button', fakeAsync(() => { expect(component.dialog.open).toHaveBeenCalledTimes(0); clickAddNewButton(component, fixture); fixture.detectChanges(); tick(); expect(component.dialog.open).toHaveBeenCalled(); }));
Таким образом, возможен чистый тест компонента без слишком большого количества зависимостей. Да, я создаю новый экземпляр своего OfferFormDialogComponent, но поскольку его конструктор в любом случае ничего не делает и сам не активен, все в порядке.
Весь тест и класс можно найти на github / gist
Тесты
Компонент