Итак, у меня есть MatDialog Box, который при закрытии отправляет некоторые значения формы.Затем я отправляю действие в методе afterClosed, предоставляемом MatDialogRef.
Это работает вполне нормально, когда я проверяю его вручную.Но во время модульного тестирования отправка не вызывается, и мой тест не проходит.
Мой код, который запускается при открытии диалогового окна и отправляет действие при закрытии.
openAddUserDialog() {
this.addUserDialog = this.dialog.open(AddUserDialogComponent, {
width: 'max-content',
height: 'max-content',
minWidth: '35vw',
minHeight: '20vh',
autoFocus: false
});
this.addUserDialog.afterClosed().subscribe(result => {
console.log(result);
this.store.dispatch({type: UserActions.ActionTypes.TryAddUser, payload: result.value});
});
}
Макет для MatDialog
export class MatDialogMock {
open() {
return {
afterClosed: () => of(initialValue)
};
}
}
TestBed Config
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [MaterialModule, ReactiveFormsModule, BrowserAnimationsModule],
declarations: [ UserManagementDialogComponent ],
providers: [{provide: MatDialog, useClass: MatDialogMock}, provideMockStore({initialState})]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(UserManagementDialogComponent);
component = fixture.componentInstance;
store = TestBed.get(Store);
spyOn(store, 'dispatch').and.callThrough();
dialog = TestBed.get(MatDialog);
fixture.detectChanges();
});
И тест, который должен пройти
it('should dispatch an action when the form is submitted', fakeAsync(() => {
spyOn(dialog, 'open').and.callThrough();
const dialogRef = dialog.open();
dialogRef.afterClosed().subscribe(result => {
console.log('verbrberbhyn', result);
expect(result).toEqual(initialValue);
tick();
expect(store.dispatch).toHaveBeenCalledTimes(1);
expect(store.dispatch).toHaveBeenCalledWith({
type: UserAtions.ActionTypes.TryAddUser,
payload: initialValue
});
});
}));