Жасмин шпионит между Chrome и IE 11 - PullRequest
0 голосов
/ 03 сентября 2018

У меня был следующий тест

  it('should send message to window...', inject(
    [AppEventsService],
    (service: AppEventsService) => {
      spyOn(window.parent, 'postMessage').and.callThrough();
      service.sendMessage('MyTestEvent', 'empty');
      expect(window.parent.postMessage).toHaveBeenCalledWith(
        JSON.stringify({ e: 'MyTestEvent', v: 'empty' }),
        '*'
      );
    }
  ));

это работает в Chrome, но в IE я получил

Error: <toHaveBeenCalledWith> : Expected a spy, but got Function.
Usage: expect(<spyObj>).toHaveBeenCalledWith(...arguments)

а почему? Метод в обслуживании делает следующее

 public sendMessage(event: string, param: string) {
    const message = {};
    message['e'] = event;
    if (StringUtils.isNullOrWhiteSpace(param)) {
      message['v'] = '';
    } else {
      message['v'] = param;
    }

    window.parent.postMessage(JSON.stringify(message), '*');
  }

1 Ответ

0 голосов
/ 03 сентября 2018

Проблема заключается в том, что в IE 11 метод propertyDescriptor метода postMessage помечается как недоступный для записи и неконфигурируемый. Таким образом, в IE 11 вы не можете перезаписать это свойство.

Ваш лучший подход здесь - обернуть метод windows.parent.postMessage в пользовательский метод, например:

function postToParent(...args) {
  return window.parent.postMessage(...args);
}

и затем замените все вызовы на window.parent.postMessage на postToParent.

Наконец, в ваших тестах выполните:

spyOn(window, 'postToParent').and.callThrough();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...