Angular 6: Как написать тестовую спецификацию жасмина для диалогового окна
Я пытался написать тестовую спецификацию для 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();
}
1 ответ
Я решил то же самое, издеваясь 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.configureTestingModule
с matDialog
а также MAT_DIALOG_DATA
:
providers: [
{ provide: MatDialogRef, useValue: {} },
{ provide: MAT_DIALOG_DATA, useValue: {} }
]