jquery - 检查 Capybara::Node::Element 是否已被 jQuery.remove() 删除

标签 jquery tdd capybara ruby-on-rails-5

我正在尝试进行以下测试:

it 'remove item from cart' do
  visit cart_path
  button = page.find("a[href='/carts/#{item.id}/remove']")
  card = find_ancestor_with_class(button, '.card')
  button.click
  # check if card has been removed from page
end

此测试应该有效,因为以下 JS 会从页面中删除卡片:

$.ajax({
  url: link,
  method: "GET",
  success: function() {
    $('#alert-modal').modal('show');
    $(button).closest(".card").remove();
  }
});

如何验证 .card html 是否已从页面中删除?

最佳答案

要检查页面上是否有某些内容不可见,您会执行以下操作

expect(page).to have_no_css(".card")

expect(page).not_to have_css(".card")

所以总的来说,它变成了

visit cart_path
click_link(href: "/cars/#{item.id}/remove")    
expect(page).not_to have_css(".card")

只有删除所有 .card 元素时,这才有效。如果页面上仍有其他 .card 元素,则根据您希望在卡片中出现的文本或卡片元素(id 等)上的其他属性/属性进行检查,例如项目描述或其他显示内容,如

expect(page).not_to have_css(".card", text: item.description)

如果您经常处理 .card 元素,您还可以编写自定义 Capybara 选择器以使内容更易于阅读,本地化“卡片”等的 CSS 定义

Capybara.add_selector :card do
  xpath do |content| 
    xp = XPath.css('.card')
    xp = xp[XPath.string.n.is(content)] unless content.nil?
    xp
  end
end

然后应该允许

expect(page).to have_no_selector(:card)
expect(page).to have_no_selector(:card, item.description)

等等

关于jquery - 检查 Capybara::Node::Element 是否已被 jQuery.remove() 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973789/

相关文章:

javascript - DOM 节点的警告 : ReactDOMComponent: Do not access . Prop

ruby-on-rails - ActiveRecord 是否使 Ruby on Rails 代码难以测试?

android - 如何使用 jMock ClassImposterizer 进行 Android 单元测试?

ruby-on-rails-4 - 如何测试请求规范的 api 响应的键和值

ruby - 使用 ruby​​ capybara 获取页面的所有 href 链接

javascript - Ubergallery 和 ajax

javascript - 将 jpeg 图像转换为正确的字节数组时遇到问题

javascript - 对除一张图像之外的所有 body 应用不透明度

jquery - 图片加载时如何去除空白?

ruby-on-rails - 如何在 capybara 中点击表单提交按钮