Angular 6: Как написать спецификацию теста jasmine для диалога mat

Я пытаюсь написать тестовую спецификацию для mat-dialog, но мне не удалось добиться успеха, проблема в том, что он вызывается функцией. Как это сделать? Спасибо за вашу помощь. Вот мой код

closeDialogCancelButton() {
    if (this.editFormData.dirty) {
      let dialogRef = this.dialogCancel.open(DialogCancel,
        {
          width: '250px',
          disableClose: true,
          data:
          {
            id: '1'
          }
        });
      dialogRef.afterClosed().subscribe(result => {
        if (result)
          this.dialog.close();
      });
    } else
      this.dialog.close();
  }

Можете ли вы добавить весь код компонента?

Anuradha Gunasekara 03.07.2018 11:37

Я не могу предоставить весь код компонентов, но я думаю, что этого достаточно для создания спецификаций в jasmine.

Enrique_Iglesias 03.07.2018 12:11

Я пытался много раз, но возникали некоторые ошибки из-за того, что он указывал на другие компоненты.

Enrique_Iglesias 03.07.2018 12:13

что такое this.dialogCancel это сервис?

Anuradha Gunasekara 03.07.2018 12:15

это просто объект матдиалога

Enrique_Iglesias 03.07.2018 13:47

Вы уверены, что не вводите dialogCancel в конструктор компонента?

Anuradha Gunasekara 06.07.2018 05:29
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
6
8 357
2

Ответы 2

Я решил то же самое, высмеяв MatDialog. то есть:

import { of } from 'rxjs';

export class MatDialogMock {
    open() {
        return {
            afterClosed: () => of({ name: 'some object' })
        };
    }
}

Затем добавьте этот макет в конфигурацию TestBed.

providers: [{provide: MatDialog, useClass: MatDialogMock}]

Расширяя ответ Данило, и с помощью Angular 7 вы можете протестировать matDialog так же, как показано ниже.

С методом тестирования:

openExport() {
    const dialogRef = this.matDialog.open(ExportComponent, {
        data: {}
    });

    dialogRef.afterClosed().subscribe(result => {
        if (result !== 'cancel') {
            this.export(result);
        }
    });
}

И с моим действием mat-dialog-close, определенным как таковое:

<div mat-dialog-actions>
    <button mat-button [mat-dialog-close] = "'cancel'">Cancel</button>
    ...
</div>

Вы можете использовать следующие тесты:

describe('openExport', () => {
  const testCases = [
    {
      returnValue: 'Successful output from dialog',
      isSuccess: true
    },
    {
      returnValue: 'cancel',
      isSuccess: false
    },
  ];

  testCases.forEach(testCase => {
    it(`should open the export matDialog and handle a ${testCase.isSuccess} output`, () => {
      const returnedVal = {
        afterClosed: () => of(testCase.returnValue)
      };
      spyOn(component, 'export');
      spyOn(component['matDialog'], 'open').and.returnValue(returnedVal);
      component.openExport();

      if (testCase.isSuccess) {
        expect(component.export).toHaveBeenCalled();
      } else {
        expect(component.export).not.toHaveBeenCalled();
      }

      expect(component['matDialog'].open).toHaveBeenCalled();
    });
  });
});

Не забудьте предоставить вашему TestBed.configureTestingModulematDialog и MAT_DIALOG_DATA:

providers: [
  { provide: MatDialogRef, useValue: {} },
  { provide: MAT_DIALOG_DATA, useValue: {} }
]

Другие вопросы по теме