Не удалось получить значение scrollTop внутри теста Jasmine

Это мой первый вопрос к Stack Overflow, и Жасмин для меня довольно новичок, поэтому я надеюсь, что у меня все в порядке.

У меня есть тест Jasmine, в котором я пытаюсь установить положение прокрутки моей страницы на определенное значение. Фактический код довольно сложен, но мне удалось сделать более простой пример неудачного теста:

it("should set scrollTop to equal 100", function () {
  setFixtures("<div id='page' style='height: 1000px;'>Page content</div>");

  spyOn($.fn, "scrollTop");
  $("#page").scrollTop(100);

  expect($.fn.scrollTop).toHaveBeenCalledWith(100); // this test passes
  expect($("#page").scrollTop()).toEqual(100);
});

Результат: Ожидается, что 0 будет равно 100.

Я установил для scrollTop значение 100 и ожидаю, что в следующей строке будет именно так. Как этот тест проваливается?

Если это имеет значение, я использую Jasmine 1.3.1 с requirejs и jasmine-jquery в качестве расширения.


person balzafin    schedule 07.11.2014    source источник
comment
А что вы собираетесь тестировать? Этот scrollTop работает? Это библиотека третьей части — автор этой библиотеки должен ее протестировать. Я предлагаю установить шпион на scrollTop и ожидать, что шпион будет вызван   -  person Krzysztof Safjanowski    schedule 07.11.2014
comment
На самом деле я сохраняю значение в объекте sessionStorage при нажатии на элемент в списке. Я использую его позже, когда пользователь возвращается к списку, когда я устанавливаю scrollPostion на это значение. Таким образом, пользователи могут начать с того места, на котором они остановились. Кажется, это отлично работает в самом приложении. Я установил на него шпиона, и он работает правильно (также обновил код примера). Возможно, вы правы в том, что я перебарщиваю, но мне все же любопытно узнать, почему этот тест не проходит.   -  person balzafin    schedule 07.11.2014
comment
В текущей версии spyOn будет перехватывать все вызовы scrollTop и завершать. Пожалуйста, рассмотрите возможность использования callThrough или callFake, чтобы знать, что происходит. Еще одна вещь, которую нужно сделать … Вы можете поставить debugger statemanet перед первым expect и запустить тест в веб-браузере (пожалуйста, также откройте консоль, чтобы браузер мог поймать debugger)   -  person Krzysztof Safjanowski    schedule 08.11.2014


Ответы (1)


Я не вижу, что делает setFixtures, но думаю, потому что;

  • Созданные узлы DOM нигде не были добавлены в действующий DOM.
  • DIV не предназначен для прокрутки.
  • В DIV недостаточно содержимого для отображения полосы прокрутки.

Вот простой пример;

var div = document.createElement('div');
div.style.height = '100px';
div.style.width = '100px';

// ensure the content has a track for scrollbars (won't work without this)
div.style.overflow = 'scroll';

// it also needs enough content to actually be scrollable (won't work without this)
div.innerHTML = '<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x';

// needs to be appended to the live DOM (won't work without this)
document.body.appendChild(div);

// we can now set this value
div.scrollTop = 50;

// and read it back
console.log(div.scrollTop);
// == 50

Я надеюсь, что это поможет, спасибо.

person Jamie Mason    schedule 23.01.2017