Давайте разберем вашу проблему шаг за шагом.
Сначала , зарегистрировав
providers: [{ provide: MatDialog, useValue: {} }],
Ваш испытательный стенд будет вводить объект без поведения (например,методы экземпляра / члены) всякий раз, когда необходимо разрешить MatDialog
.
Это на самом деле не нужно, поскольку вы импортируете MatDialogModule
в свой тестовый стенд, поэтому экземпляр MatDialog
может быть решен без проблем. Но давайте придерживаться вашего подхода. Это решение потребует от вас удалить эту строку.
Секунда , выполнив:
spyOn(component.dialog, 'open')
youустанавливаем прокси для метода экземпляра open
в объекте, на который ссылается component.dialog
.В этом случае пустой объект, который вы зарегистрировали ранее.
Несмотря на то, что у объекта нет такого члена, Жасмин будет динамически добавлять прокси вместо него.Вот почему вы не видите ошибку, такую как this.dialog.open is not a function
.
И наконец , при каждом взаимодействии с прокси будет записываться информация об этих взаимодействиях и перенаправляться вызовы наоригинальный open
член.Поскольку исходной реализации не было, вместо нее будет использоваться функция без возврата , которая, наконец, вызовет accessing foo of undefined
.
TL; DR;
Удалите { provide: MatDialog, useValue: {} }
и используйте следующее, чтобы смоделировать требуемый MatDialogRef
экземпляр:
import { EMPTY} from 'rxjs';
it('openDialog() should open a dialog', () => {
const openDialogSpy = spyOn(component.dialog, 'open')
.and
.returnValue({afterClosed: () => EMPTY});
component.openDialog();
expect(openDialogSpy).toHaveBeenCalled();
});