Тестирование обновлений javascript с использованием нескольких кассет видеомагнитофона

Я использую Capybara и Poltergeist для тестирования индексной страницы, которая использует setTimeout для периодического обновления содержимого страницы. Содержимое страницы переходит между тремя состояниями на основе внешней службы, и у меня есть кассета для каждого из этих состояний.

Я пытаюсь проверить обновление, используя такой код:

VCR.use_cassette 'object_new' do
  visit index_path
  page.should have_content 'New'
end

VCR.use_cassette 'object_running' do
  page.should have_content 'Running'
end

VCR.use_cassette 'object_complete' do
  page.should have_content 'Complete'
end

Первый have_content преуспевает, а второй нет. Capybara должен ждать возврата любых асинхронных вызовов и обновлять DOM, чтобы эти утверждения проходили. Я пробовал using_wait_time заставить утверждение ждать долго после возврата вызова ajax, но это не помогает. Любые идеи относительно того, что может отсутствовать в моей спецификации, чтобы заставить эту работу работать? Функциональность работает в браузере; просто тесты не проходят.


person jmacdonald    schedule 26.08.2013    source источник


Ответы (2)


Когда вы используете драйвер полтергейста для запуска своих тестов, ваши страницы фактически обрабатываются в отдельном процессе (например, в процессе phantomjs). ).

Это означает, что если ваш javascript загружает какой-либо внешний контент, PhantomJS фактически загрузит внешний контент, а не загрузит кассету видеомагнитофона, поскольку видеомагнитофон влияет только на вызовы HTTP, сделанные в рамках процесса Ruby, выполняющего ваши тесты.

Вместо того, чтобы пытаться протестировать свой код JS с помощью Capybara, вам следует протестировать свой JS с помощью чего-то вроде Jasmine, где у вас будет возможность имитировать вызовы внешней службы.

person lmars    schedule 26.08.2013
comment
Вызовы внешней службы выполняются из приложения Rails, а JS обращается к RESTful API. Я хотел бы протестировать полный стек, поэтому я бы предпочел использовать API приложения Rails и смоделировать сервис на серверной части с помощью VCR. Вот в чем проблема; когда JS вызывает API, на основе спецификации он должен был изменить кассеты (поскольку JS вызывает тестовую версию моего работающего приложения Rails), но я все еще получаю ответ, как если бы была загружена первая кассета. - person jmacdonald; 27.08.2013
comment
Как вы координируете вызовы AJAX из кода JS со сменой кассеты? Вполне вероятно, что вызовы AJAX происходят после/до смены кассеты, потому что они происходят в отдельном процессе. Возможно, стоит добавить запись временных меток в изменения кассет и контроллеры, чтобы видеть, когда выполняются запросы. - person lmars; 27.08.2013
comment
Глядя на ответы AJAX, они сообщают об ошибке 500, поэтому тесты не проходят. Просмотр журналов испытаний не раскрывает никаких других подробностей. Бит AJAX повторяется каждые 5 секунд, поэтому, даже если он не поймает правильный ответ с первой попытки, в конечном итоге он это сделает. Я не думаю, что переключение кассеты вызывает ошибку, потому что видеомагнитофон обычно очень громкий, когда запрос делается без кассеты. Первое утверждение page.should действительно проходит, чего бы оно ни стоило. - person jmacdonald; 28.08.2013

Первоначальная реализация на самом деле правильная, но мой JS не был достаточно устойчивым, чтобы обрабатывать ошибки сервера. Запросы отправлялись между перезагрузками кассеты и возвращали неуспешные HTTP-статусы.

Обновление JS для обработки ошибочных запросов и продолжение опроса решили эту проблему, и, в конце концов, это то, как JS должен был вести себя в любом случае.

person jmacdonald    schedule 03.10.2013