Добавьте список событий в окно и запустите обработчик в тесте jasmine с помощью углового

#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();
    });
});
 

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