2016-02-07 2 views
1

У меня есть ссылка ajaxified в приложении Rails, которое при щелчке приводит к изменениям в DOM.Как проверить ответы Ajax с Capybara?

Я использую Capybara для проверки этого изменения DOM. Тест не работает, но в браузере это взаимодействие пользователя приводит к ожидаемому изменению DOM.

Я подозреваю, что тест не ждет завершения запроса ajax. Тем не менее, я понял, что expect(page).to have_selector ожидает, пока указанный элемент не будет существовать.

Что я делаю неправильно, и каков правильный способ проверить это взаимодействие?

Код выглядит следующим образом:

#objects/show.html.erb 
... 
<div class='like-container'> 
    <%= render partial: "shared/like_button" %> 
</div> 
... 


#shared/like_button 
<% if current_user.likes? @likable %> 
    <%= link_to 'Unlike', 
    unlike_path(#params), 
    id:"#{@likable.class.name.underscore }_#{ @likable.id }_like", 
    class: "unlike-btn", 
    method: :delete, 
    remote: true 
    %> 
<% else %> 
    <%= link_to 'Like', 
    like_path(#params), 
    id: "#{@likable.class.name.underscore }_#{ @likable.id }_like", 
    class: "like-btn", 
    method: :post, 
    remote: true 
    %> 
<% end %> 


#likes/create.js 
$('#<%= @likable.class.name.underscore %>_<%= @likable.id %>_like').replaceWith('<%= j render partial: "shared/like_button" %>'); 


#likes/destroy.js 
$('#<%= @likable.class.name.underscore %>_<%= @likable.id %>_like').replaceWith('<%= j render partial: "shared/like_button" %>'); 


#user_likes_object_spec.rb 
feature 'likes object' do 
    before :each do 
    @object = create :object 
    @user = create :user 
    login_as @user 
    visit object_path @object 
    end 

    scenario 'it creates and then destroys like when clicked', js: true do 
    expect(page).to have_link "Like", href: like_path(#params) 
    click_link 'Like' 
    # the test is failing on the following line 
    # Failure/Error: expect(page).to have_selector("a.unlike-btn") 
    # expected to find css "a.unlike-btn" but there were no matches 
    expect(page).to have_selector("a.unlike-btn") 
    click_link 'Unlike' 
    expect(page).to have_selector("a.like-btn") 
    end 
end 

Почему не expect(page).to have_selector("a.unlike-btn") ждать, пока этот DOM элемент не существует?

+0

Добавить (3) перед ожиданием. –

+0

Спасибо @ArupRakshit, разве это не сделает тесты хрупкими, если, например, ajax иногда занимает 4 секунды? Каков правильный способ обнаружения изменения DOM в Capybara? –

+1

, который я сказал, чтобы проверить, разрешает ли он или нет. После этого я могу дать тот же совет, который вы прокомментировали в принятом ответе. :) –

ответ

3

This article объясняет установки времени ожидания по умолчанию, поставив:

Capybara.default_wait_time = 10 

в ваш конфигурационный файл RSpec.

This article объясняет, что DOM полностью обновляется.

+0

Спасибо, опция 'wait' очень полезна. 'has_selector ('a.unlike-btn', wait: 10). Оказывается, у меня также была проблема с правами пользователей, которая предотвращала ожидаемый ответ, но это помогло мне выявить проблему. Благодаря ! –

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