2016-06-26 12 views
1

В настоящее время написание тестов для функции отслеживания времени приложения Rails. Я не могу понять способ имитации нажатия кнопки «play» на таймере, ожидания нескольких секунд, нажатия паузы и отправки формы (создание нового объекта Timestamp).Rails: как я могу проверить секундомер в моих тестах интеграции Capybara?

test "track time with stopwatch" do 
    visit new_project_timestamp_path(@project) 
    find('#play_button').click 
    sleep 4.0 
    find('#pause_button').click 
    click_button "submit_new_timestamp" 
    visit project_path(@project) 
    assert page.has_content? "4 seconds" 
end 

^Это суть того, что я хочу, чтобы это сделать, но спать, очевидно, не работает, потому что он полностью приостанавливает поток, в то время как я хочу испытание на своего рода «ждать» в то время как секундомер делает его вещь на несколько секунд. Вышеуказанный тест не выполняется, потому что на самом деле не отслеживается время; пауза нажата сразу после игры, в глазах таймера, и поэтому форма отправляется без фактического времени регистрации, что, конечно же, вызывает ошибку проверки.

Есть ли способ, которым я смогу симулировать ожидание несколько секунд без фактического приостановления потока?

ответ

0

(Примечание: огромное спасибо Tom Walpole за его ответ. Проблема в том, что я не использовал JS-совместимый веб-драйвер. Думал, что я напишу это для всех, у кого есть похожие проблемы из-за того же недостатка понимания, что и у меня.)

Проблема в том, что я не использовал веб-драйвер, который выполняет Javascript. По умолчанию Capybara использует драйвер :rack_test, который, будучи быстрым, не выполняет Javascript.

Итак, для интеграционных тестов, которые полагаются на выполняемый JS (в моем случае, взаимодействующем с секундомером), что-то вроде :poltergeist - хорошая идея. Чтобы установить его, добавьте

gem 'poltergeist' 
    gem 'phantomjs', :require => 'phantomjs/poltergeist' 

в Gemfile и запустить bundle install.

Вам нужно добавить

require 'capybara/poltergeist' 
    Capybara.javascript_driver = :poltergeist 

вашему хелперов файл теста/спецификации. Затем все, что вам нужно сделать, - установить Capybara.current_driver = Capybara.javascript_driver везде, где вам нужен интеграционный тест с поддержкой JS.

0

Предположим, вы используете JS-совместимый драйвер (селен, полтергейст, capybara-webkit), затем браузер, приложение под тестированием и все тесты запускаются в своих потоках/процессах, поэтому спать в тестовом потоке должно быть идеально хорошо. Вместо того, чтобы отправлять оба клика без разницы во времени, более вероятно, что ваш click_button отменяется visit сразу же после него, и поэтому вы не получаете новую созданную временную метку. Вы должны утверждать, для какого-то видимого изменения между «click_button` и„визита“, чтобы обеспечить создание нового действия временной метки завершена, прежде чем говорить браузер запросить новую страницу

click_button "submit_new_timestamp" 
page.assert_text "Timestamp created" # whatever message/visible change occurs after clicking the button 
visit project_path(@project) 

Кроме того, с помощью assert_text , assert_selector, assert_title, assert_current_path будут предоставлять вам более эффективные сообщения об ошибках, если утверждения не будут выполнены, чем утверждение в методах has_xxx?

+0

Сообщения об ошибках в форме (и в тестовых журналах) показывают, что поле секунды в форме не заполнено. Это заполняется количеством секунд, отслеживаемых секундомером, после отправки с помощью jQuery, поэтому мой предполагалось бы, что это не выполняется должным образом или вообще (это прекрасно работает в процессе разработки и производства). Я постараюсь переключить драйверы, возможно, это решит проблему. Если нет, возможно, в коде jQuery есть ошибка, которая появляется только в тестовой среде. –

+0

@BenLawton Как вы заполняете поля формы, обработчик JS click? Если вы используете JS-совместимый драйвер (драйвер драйвера стойки по умолчанию capybara не выполняет JS)? –

+0

Первоначально использовал значение по умолчанию, но я просто попытался настроить 'Capybara.javascript_driver =: selenium' на отсутствие эффекта. –