首页 > 解决方案 > RSpec + Capybara 范围界定返回意外结果

问题描述

我有两个表:建议和关键字。我正在尝试测试从关键字中删除项目(它会自动将其放入建议中)。

这是我的测试:

it "removes a chosen keyword" do
  page.first(:link, "Add").click
  within(:css, "#keywords") do
    find('li:nth-child(1)').click_link('X')
    expect(page).to have_no_content(item.search.term)
  end
end

结果是:

  1) New collection Suggestions removes a chosen keyword
     Failure/Error: expect(page).to have_no_content(item.search.term)
       expected not to find text "Gift for her" in "Keywords\nGift for her X"
     # ./spec/features/collections_spec.rb:60:in `block (4 levels) in <top (required)>'
     # ./spec/features/collections_spec.rb:53:in `block (3 levels) in <top (required)>'

这是 body 元素的打印:

  <div class="col-lg-5 col-md-6 mb-4" id="suggestions">
    <div class="card h-100">
      <div class="card-body">
        <h4 class="card-title">Suggestions</h4>
        <p class="card-text"> 
          <ul class="list-group list-group-flush" id="suggestion-list">
                <li class="list-group-item">
                  Gift for her
                  <a class="btn btn-primary" rel="nofollow" data-method="post" href="/collections/1/item/choose.1">Add</a><a class="btn btn-primary" rel="nofollow" data-method="post" href="/collections/1/item/destroy.1">X</a><br>
                </li>
          </ul>
        </p>
      </div>
    </div>
  </div>

<div class="col-lg-5 col-md-6 mb-4" id="keywords">
    <div class="card h-100">
      <div class="card-body">
        <h4 class="card-title">Keywords</h4>
        <p class="card-text">                     
          <ul class="list-group list-group-flush" id="keyword-list">
          </ul>
        </p>
      </div>
    </div>
  </div>

还有我的show.html.erb文件:

  <div class="col-lg-5 col-md-6 mb-4" id="suggestions">
    <div class="card h-100">
      <div class="card-body">
        <h4 class="card-title">Suggestions</h4>
        <p class="card-text"> 
          <ul class="list-group list-group-flush" id="suggestion-list">
            <% if @suggestions %>
                <% @suggestions.each do |s| %>
                <li class="list-group-item">
                  <%= Hpricot.uxs s.search.term %>
                  <%= link_to 'Add', collection_item_choose_path(@collection, s),{  method: :post, class: "btn btn-primary" } %><%= link_to 'X', collection_item_destroy_path(@collection, s),{  method: :post, class: "btn btn-primary" } %><br>
                </li>
              <% end %>
            <% end %>
          </ul>
        </p>
      </div>
    </div>
  </div>

<div class="col-lg-5 col-md-6 mb-4" id="keywords">
    <div class="card h-100">
      <div class="card-body">
        <h4 class="card-title">Keywords</h4>
        <p class="card-text">                     
          <ul class="list-group list-group-flush" id="keyword-list">
            <% if @keywords %>
              <% @keywords.each do |s| %>
                <li class="list-group-item">
                  <%= Hpricot.uxs s.search.term %>
                  <%= link_to 'X', collection_item_remove_path(@collection, s),{  method: :post, class: "btn btn-primary" } %><br>
                </li>
              <% end %>
            <% end %>
          </ul>
        </p>
      </div>
    </div>
  </div>

在我看来,范围界定以某种方式关闭,尽管我检查过并且链接确实点击了(你可以在 puts page.body 中看到它)。有任何想法吗?提前致谢!

标签: ruby-on-railsrspeccapybararspec-rails

解决方案


这不太可能是一个范围界定问题,因为报告的文本是“Keywords\nGift for her X”——而如果它在“建议”部分看到文本,如果那里也有“添加”文本。

更有可能的是,由于某处出现错误,您的应用程序没有处理单击“X”。检查您的 test.log 以确切了解正在调用的方法以及是否存在错误。

此外,您没有提及您与 Capybara 一起使用的驱动程序。如果您使用的是支持 JS 的驱动程序,则可能您没有Capybara.default_max_wait_time为您正在测试的硬件设置足够高的值和/或 turbolinks(假设您的应用程序中有它)参与其中。同样,查看您的test.log内容应该可以更好地了解实际发生的情况。另一个尝试是用来save_and_open_screenshot获取实际页面的图像(假设您使用的是支持它的驱动程序)

如果您没有使用支持 JS 的驱动程序(即您使用的是 rack_test),那么您可能不需要capybara/rails并且没有使用链接的方法。同样,检查test.log将显示用于每个请求的方法(get vs post)。


推荐阅读