Подтвердить что ты не робот

Как мне подделать анимацию jQuery с помощью Sinon в Jasmine unit test?

У меня есть 1-секундное действие jQuery .animate, которое запускается через 5 секунд после загрузки страницы. Я установил таймер Sinon в своем модульном модульном модуле Jasmine и проверил после отметки 7 секунд, чтобы узнать, соответствуют ли свойства после анимации, как они должны быть.

Это не работает правильно, поэтому я разместил экземпляр самой анимации на моей тестовой странице Jasmine HTML, чтобы лучше понять, что происходит.

  • В Firefox и Chrome загружается страница, вызывается функция анимации, unit test немедленно выходит из строя, а затем (также сразу) анимация заметно появляется.

  • В IE, Opera и Safari загружается страница, вызывается функция анимации, unit test немедленно завершается с ошибкой, и анимация никогда не появляется.

На что я надеялся, было следующее (во всех браузерах):

  • Загрузка страницы, вызывается функция анимации, анимация завершается мгновенно, а unit test сразу же выполняется.

Глядя на документацию Sinon, поддельные таймеры охватывают следующие процессы: setTimeout, clearTimeout, setInterval, clearInterval, Date

Я не знаю, как работает анимация jQuery, но я полагаю, что она использует CSS для перехода, а переходы CSS не рассматриваются в Sinon useFakeTimers, поэтому я думаю, что это проблема. Однако, если я прав по поводу проблемы, мне все еще нужно решение.

Может, мне стоит попробовать что-то другое, кроме Синона? Жасмин waits() отлично работает в этом тесте, но невероятно непрактичен для нетерпеливых людей, подобных мне.

Любые другие предложения? Пожалуйста, имейте в виду, что я новичок в тестировании модулей JS, поэтому смутные ответы будут меня путать больше, чем помочь мне.; О)

4b9b3361

Ответ 1

Вы можете использовать jQuery off, чтобы отключить эффекты jQuery:

jQuery.fx.off = true

Это не решит вашу проблему в течение 7 секунд ожидания вашего события, но это означает, что вы можете проверить, что DOM был изменен, как вы ожидали.

Ответ 2

У меня была такая же проблема. Я считаю, что это происходит потому, что анимация jQuery использует requestAnimationFrame(), если она доступна, вместо того, чтобы полагаться на setTimeout().

Я работал над этой проблемой, установив для всех requestAnimationFrame функций, специфичных для браузера, для объекта window значение null:

window.webkitRequestAnimationFrame = null;
window.mozRequestAnimationFrame = null;
window.oRequestAnimationFrame = null;

Убедитесь, что этот код выполняется до загрузки jQuery.

Ответ 3

Я думаю, что это возможно с SinonJs, как показано здесь: http://sinonjs.org/qunit

test("should animate element over 500ms", function () {
   var el = jQuery("<div></div>");
   el.appendTo(document.body);

   el.animate({ height: "200px", width: "200px" });
   this.clock.tick(510);

   equals("200px", el.css("height"));
   equals("200px", el.css("width"));
});