Я пытаюсь использовать Jasmine 2.0 для написания модульных тестов для некоторой логики в приложении AngularJS, но логика находится внутри прослушивателя событий. От контроллера:Тестирование postMessage с Jasmine async не работает
window.addEventListener('message', function(e) {
if (e.data === "sendMessage()") {
$scope.submit();
}
}, false);
А из тестового файла:
describe("post message", function() {
beforeEach(function(done) {
var controller = createController(controllerParams);
spyOn($scope, 'submit');
window.postMessage('sendMessage()', '*');
done();
});
it('should submit on a sent message', function (done) {
expect($scope.submit).toHaveBeenCalled();
done();
});
});
Но тест не пройден, шпион никогда не быть пораженным. Дополнительная информация от ввода в консоль отладочной информации:
window.addEventListener
в контроллере IS получает вызов.- Блок
beforeEach
иit
оба вызываются. - Вышеупомянутый обработчик сообщений в контроллере не вызывается во время теста.
- Сообщение, отправленное в этом тесте, в конечном итоге получает обработчик сообщения несколько раз, но только после завершения теста.
Что, по моему мнению, отсутствует здесь?
Вы не должны вызывать postMessage в * другом * окне, чем тот, который получит событие? (скажем, создание всплывающего окна, как это делается на https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage?redirectlocale=en-US&redirectslug=DOM%2Fwindow.postMessage) – phtrivier
Пробное изменение это сообщение после всплывающего окна, а не постсообщение из окна, но все, что изменилось, заключается в том, что вместо того, чтобы получать сообщение слишком поздно, оно вообще не получает сообщение. –
@AlanGordon: Вы уже нашли решение для этого? У меня такие же проблемы ;-) –