2016-08-24 3 views
0

Я пытаюсь создать следующий тест: Редактировать модель (клиентская сторона), проверить, обновлено ли представление, и если модель изменилась в базе данных.Teardown, вызванный в середине теста Capybara

есть код:

test 'a' do 
    user = User.joins(:organization_users).find_by organization_users: { role: OrganizationUser.roles.values_at(:ORGANIZER, :ADMINISTRATOR) } 

    sign_in_user user 

    criterion = create(:criterion, scoring_id: @scoring.id, name: "Test criterion name", 
         description: "Test description") 
    step = create(:step, criterion_id: criterion.id) 

    visit "scorings/" + (@scoring.id).to_s + "/criteria" 

    find("#criteria > div > div > a > i").click() 

    fill_in 'name', with: 'New name' 
    fill_in 'description', with: 'New description' 

    find('#criterion-modal > div:nth-child(2) > form > div:nth-child(4) > input').click() 

    criterion = criterion.reload 

    assert criterion.name == 'New name' 

    end 

` Driver:

Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new app , { phantomjs: Phantomjs.path } 
end 
Capybara.javascript_driver = :poltergeist 
Capybara.current_driver = Capybara.javascript_driver 

Teardown:

teardown do 
    DatabaseCleaner.clean 
    ActiveRecord::Base.connection.close 
    Capybara.reset_sessions! 
end 

Как вы можете увидеть в конце теста я перезагружать критерий , но когда я делаю это, вызывается функция разрыва. После этого база данных очищается, и я получаю ошибку «не могу найти критерий id: 1». Я использую только minitest, заводскую девушку и Capybara. Так что я хочу понять, почему Teardown вызывается, так как это не конец теста и как я могу это исправить?

спасибо.

ответ

0

Вы не показываете, что у вас настроено для вашего метода слежения, и не указываете, какой драйвер вы используете с Capybara. Однако, так как тестовый код и разрывы запускаются в одном и том же потоке, на самом деле не существует способа запустить срыв до того, как тест закончится. Что возможно (при использовании JS-совместимого драйвера, где клики обрабатываются асинхронно) для запуска разгона до того, как клик обработан/обработан кодом приложения. Это означало бы, что «критерий поиска не может быть найден: 1» на самом деле будет поступать из вашего кода контроллера. Причиной этого является то, что вы на самом деле не проверяете что-либо на странице, чтобы изменить после нажатия, чтобы тест продолжал двигаться, заканчивался (если не выполнялось утверждение), очистка от следов и действие контроллера не могут найти запись. Что-то вроде

assert_text 'Criterion updated' # if a message is displayed on successful update 

или

assert_current_path("scorings/#{@scoring.id}") # whatever path it redirects to after updating 

после click и до вашего reload

На стороне записки - Используя длинные селекторы как «# критерий-модальный> сНу: п-го ребенка (2)> form> div: nth-child (4)> input 'приведет к действительно хрупким испытаниям. Было бы гораздо проще использовать более простые селектор или помощники типа capybara click_button, если возможно

+0

Thank f или ваш совет, я отредактировал свой пост и добавил то, что вы сказали, отсутствует. Я не понимаю что-то, Срыв за вызовом до конца моего теста заканчивается, я проверил это с некоторым отладочным сообщением. Сейчас я проверяю что-то на своей странице. Запрос обновления - это Ajax one soo после отправки, я проверяю, действительно ли просмотр был обновлен. Но при перезагрузке такая же ошибка сохраняется. То, что я действительно хочу сделать, это проверить, обновлено ли представление, и если объект-критерий обновлен в базе данных. – TyLO

+0

@TyLO Где вы разместили отладочные сообщения, которые, по вашему мнению, проверяют заказ? Это просто невозможно, чтобы разрывы выполнялись до завершения тестового кода (если вы не выполняете параллельные тесты и не имеете проблем в этой настройке). Во время разговора вы должны вызвать 'Capybara.reset_sessions!' Перед вызовом 'DatabaseCleaner.clean' и не должно быть необходимости закрывать соединение. Если это не решит вашу проблему, добавьте команду, которая проверяет что-то на странице на ваш тест, чтобы она была завершена, и добавьте местоположение отладочных сообщений и фактический результат, который вы получите. –