2013-09-04 5 views
0

В моем приложении Rails, я использовал следующий JQuery, чтобы отключить возможность представить форму, нажав кнопку «войти» в поле ввода:Rails/Capybara- тест, что форма не представляет

$('input').on('keydown', function(e) { 
    if(e.which == '13') { 
    return false; 
    } 
}) 

Я хотел чтобы проверить это с Capybara, но не может понять, как это сделать. Например:

# the form being tested creates a new Shift object: 
test "enter does not submit form" do 
    shift_count = Shift.count 
    # fill in form, etc... 
    page.driver.browser.execute_script "var e = jQuery.Event('keydown'); e.which = 13; $('#shift_employee').trigger(e);" 
    assert Shift.count == shift_count 
end 

Этот тест проходит даже тогда, когда функция JQuery закомментирована, предположительно потому, что он рассчитывает Shift.count, прежде чем ActiveRecord успел сохранить новый рекорд в базу данных.

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

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

ответ

0

Таким образом, представление формы осуществляется через AJAX? Это общая проблема, с которой тестировщики сталкиваются с Capybara. Что вам нужно сделать, так это дождаться завершения AJAX.

Существует два способа сделать это. Один из них очень специфичен и является предпочтительным методом, другой является общим и должен использоваться только в том случае, если первый метод не может быть выполнен.

Первый способ - дождаться изменения содержимого в DOM. В вашем случае ничего не изменится, но если, например, вы получили предупреждение: «Вы не можете нажать« Ввод », вы должны нажать кнопку« Сохранить »!» то вы могли бы ждать, что придумать, делая что-то вроде:

page.driver.browser ... # your code 
page.should have_css(".info", :text => "You cannot ...etc...") 

Конечно, вы не должны использовать опцию :text хотя.

Другой способ - создать вспомогательный метод, например wait_for_ajax, который выполняет общий переход до завершения AJAX.

def wait_for_ajax 
    start = Time.now 
    while true 
    break if (page.evaluate_script('$.active') == 0) 
    if Time.now > start + Capybara.default_wait_time.seconds 
     fail "AJAX did not register as complete after #{Capybara.default_wait_time} seconds!" 
    end 
    sleep 0.1 
    end 
end 

Это базируется старый способ, которым люди использовали для проверки AJAX, но этот новый сценарий является предпочтительным для Капибара 2.0.

Тогда ваш шаг должен сделать следующее:

page.driver.etc 
wait_for_ajax 

Это wait_for_ajax метод может перейти к любому файлу Огурцы загрузит.

+0

Форма отправляется через AJAX, когда вы нажимаете кнопку «Сохранить», но это не то, что я тестирую здесь. Здесь я хочу протестировать _absence_ AJAX (или что-то еще). Я также использовал стратегию, аналогичную вашему первому предложению, путем вызова AJAX только для того, чтобы что-то на странице было обновлено. Но это все еще не говорило мне, что другое действие AJAX - отправка формы - не было сделано, возможно, например, после завершения первого вызова AJAX.Я ищу верный способ узнать, что сервер не получает запрос POST, независимо от того, что еще происходит. – grandinero

0

Я получил его, чтобы работать, когда Capybara пересматривает страницу, а затем проверяет Shift.count. Тест теперь терпит неудачу, когда функция jQuery закомментирована и проходит, когда функция раскоментирована. Я все равно хотел бы знать, есть ли лучший способ.

Смежные вопросы