我正在使用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。我的程序代码(删除方法)按预期工作,因此问题似乎是我的测试代码。我该怎么做才能帮助水豚找到用户? 感谢您的任何帮助!
更新:这是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>
<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选择器不是很熟悉。对于水豚,当你说:
#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的一部分。