При тестировании компонента, который динамически открывал диалоговое окно с использованием 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 MdDialogRef
let 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
Тесты
Компонент