水豚找不到删除操作的用户

Capybara can't find user for delete action

我正在使用 RSpec (v. 3.1.0) 和 Capybara (v. 2.4.3) 来测试我的 Rails 4 应用程序。我的用户删除 spec.rb 包含以下代码:

it "is successful when clicking the destroy link" do
      visit "/users"          
      save_and_open_page
within "#user_#{user.id}" do                        
    click_link "Destroy"            
end

    expect(page).to have_content("User was successfully destroyed.")

水豚抛出以下错误:

 1) Deleting User is successful when clicking the destroy link
 Failure/Error: within "#user_#{user.id}" do
 Capybara::ElementNotFound:
   Unable to find css "#user_509"

Save_and_open_page 显示 FactoryGirl 创建了一个用于测试的用户。错误消息表明用户的 id 是 509。我的程序代码(删除方法)按预期工作,所以问题似乎是我的测试代码。我可以做些什么来帮助 Capybara 找到用户?感谢您的帮助!

更新:这是 HTML 来源:

<!DOCTYPE html>
<html>  
  <head>    
  <title>Users | App </title>
  <link data-turbolinks-track="true" href="/assets/appointments.css?body=1" media="all" rel="stylesheet" />
  <link data-turbolinks-track="true" href="/assets/cardio_exercises.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/custom.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/members.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/sessions.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/static_pages.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/strength_exercises.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/trainers.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/users.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/appointments.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/cardio_exercises.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/members.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/sessions.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/static_pages.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/strength_exercises.js?body=1"></script>


  • 首页
  • Help
  • Log in
  • <div class="container">
      <h1>Listing Users</h1>
    
    <table>
      <thead>
    <tr>
      <th>User Name</th>      
      <th>Email</th>
      <th>Member</th> 
      <th>Trainer</th>     
      <th colspan="3"></th>
    </tr>
    </thead>
    
    <tbody>
       <tr>
        <td>ColeCole</td>        
        <td>xx@xxx.com</td>
        <td>true</td>
        <td>false</td>      
        <td><a href="/users/14">Show</a></td>
        <td><a href="/users/14/edit">Edit</a></td>
        <td><a data-confirm="Are you sure?" data-method="delete" href="/users/14" rel="nofollow">Destroy</a></td>
      </tr>
    </tbody>
    </table>
    
    <br>
    
     <a href="/users/new">New User</a>
    
      <footer class="footer">
     <small>
     The <a href="https://xxxx.herokuapp.com/">xxxx</a>
      by <a href="https://xxxx.herokuapp.com/">xxxx</a>
     </small>
     <nav>
    <ul>
      <li><a href="/contact">Contact</a></li>
      <li><a href="/about">About</a></li>
      <li><a href="https://xxxx.herokuapp.com/#">xxxx</a></li>
    </ul>
    </nav>
    </footer>
      <pre class="debug_dump">--- !ruby/hash:ActionController::Parameters
    action: index
    controller: users
    </pre>
    </div>
    </body>  
    </html>
    

    如果页面上只有一个删除按钮,这应该有效:

    it "is successful when clicking the destroy link" do
      visit "/users"                                
      click_link "Destroy"           
    expect(page).to have_content("User was successfully destroyed.")
    

    编辑:我假设您对 CSS 选择器不是很熟悉。对于 Capybara,当您说:

    #user_#{user.id}
    

    您不是在抓取诸如 "user_509" 之类的文本,而是在抓取具有 "user_509." 标识的 DOM 元素 因此,要让 Capybara 在您的代码中找到该元素,您必须有这样的东西:

    <a id="user_509" data-confirm="Are you sure?" data-method="delete" href="/users/14" rel="nofollow">Destroy</a>
    

    仅仅有一个文本字段是不够的,因为文本不是 DOM 的一部分。