Angular 6: Как написать тестовую спецификацию жасмина для диалогового окна - PullRequest
0 голосов
/ 03 июля 2018

Я пытался написать тестовую спецификацию для 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();
  }

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Расширяя ответ Данило, и с 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.configureTestingModule matDialog и MAT_DIALOG_DATA:

providers: [
  { provide: MatDialogRef, useValue: {} },
  { provide: MAT_DIALOG_DATA, useValue: {} }
]
0 голосов
/ 09 октября 2018

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

import { of } from 'rxjs';

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

Затем укажите этот макет в вашей конфигурации TestBed.

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

...