У меня есть ссылка 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 элемент не существует?
Добавить (3) перед ожиданием. –
Спасибо @ArupRakshit, разве это не сделает тесты хрупкими, если, например, ajax иногда занимает 4 секунды? Каков правильный способ обнаружения изменения DOM в Capybara? –
, который я сказал, чтобы проверить, разрешает ли он или нет. После этого я могу дать тот же совет, который вы прокомментировали в принятом ответе. :) –