#angular #unit-testing #jasmine #karma-jasmine
Вопрос:
У меня есть iframe, который получает сообщения от родителя. Поэтому для этого я добавляю прослушиватель событий сообщений и обрабатываю сообщения в частной функции. Я хотел бы протестировать эту функцию (без необходимости делать ее общедоступной). Это то, что у меня есть:
export class InitLoadService {
constructor(private window: Window) { }
initialize() {
this.addMessageEventListener(this.window);
}
addMessageEventListerner(window: Window){
window.addEventListener('message', this.handleReceivedMessage.bind(this));
}
private handleReceivedMessage(event: MessageEvent) {
console.log('Oh well...about time...');
....
if (event.data.type === 'authentication') {
this.handleAuthenticationMessage(event);
}
....
}
}
и в тесте у меня есть:
describe('InitLoadService', () => {
let windowMock: Window;
beforeEach(() => {
....
windowMock = jasmine.createSpyObj(['addEventListener', 'dispatchEvent']);
TestBed.configureTestingModule({
imports: [],
providers: [
InitLoadService,
{ provide: Window, useValue: windowMock }
]
});
initLoadService = TestBed.inject<InitLoadService>(InitLoadService);
});
it('should handle authentication message', () => {
spyOn(initLoadService, 'handleAuthenticationMessage');
initLoadService.addMessageEventListener(windowMock);
const evt = new MessageEvent('message', { data: { type: 'authentication' } });
windowMock.dispatchEvent(evt);
expect(initLoadService.handleAuthenticationMessage).toHaveBeenCalled();
});
});
Я пробовал разные комбинации кусочков и фрагментов, найденных в Интернете, но ничего не получалось. Я думаю, что поток в некотором роде правильный, но я не так уверен в этом издевательском объекте окна.