_header.html.erb
<header class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<%= link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav pull-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", help_path %></li>
<% if signed_in? %>
<li><%= link_to "Users", '#' %></li>
<li id="fat-menu" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Account <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", '#' %></li>
<li class="divider"></li>
<li>
<%= link_to "Sign out", signout_path, method: "delete" %>
</li>
</ul>
</li>
<% else %>
<li><%= link_to "Sign in", signin_path %></li>
<% end %>
</ul>
</nav>
</div>
</div>
</header>
user_pages_spec.rb
describe "with valid information" do
before do
fill_in "Name", with: "Example User"
fill_in "Email", with: "user@example.com"
fill_in "Password", with: "foobar"
fill_in "Confirmation", with: "foobar"
end
it "should create a user" do
expect { click_button submit }.to change(User, :count).by(1)
end
describe "after saving the user" do
before { click_button submit }
let(:user) { User.find_by_email('user@example.com') }
it { should have_selector('title', text: user.name) }
it { should have_selector('div.alert.alert-success', text: 'Welcome') }
it { should have_link('Sign out') }
end
describe "followed by signout" do
before { click_link "Sign out" }
it { should have_link('Sign in') }
end
end
失败的是:
1) User pages signup with valid information followed by signout
Failure/Error: before ( click_link "Sign out" )
Capybara::ElementNotFound:
no link with title, id, or text 'Sign out' found
(eval):2:in 'click_link'
./spec/requests/user_pages_spec.rb:63:in 'block (5 levels) in (top (required))'
手动创建用户进程后,它似乎正常工作。该链接位于下拉菜单中,如果它可能与它有关?这是MHartl rails教程中的一点,他说所有的测试都应该通过。
答案 0 :(得分:11)
可疑代码显然需要嵌套在上一个描述
的内部 describe "after saving the user" do
before { click_button submit }
let(:user) { User.find_by_email('user@example.com') }
it { should have_selector('title', text: user.name) }
it { should have_selector('div.alert.alert-success', text: 'Welcome') }
it { should have_link('Sign out') }
describe "followed by signout" do
before { click_link "Sign out" }
it { should have_link('Sign in') }
end
end
答案 1 :(得分:3)
上一个描述中的before
块尚未创建用户。这就是用户(目前尚不存在)当前未登录的原因,因此没有“退出”链接。
一种可能的解决方案是在前一个块中click_button 'submit'
。另一种方法是完全跳过before
块中的注销,因为此时没有用户登录。
答案 2 :(得分:0)
是的,它应该嵌套在前面的描述中。我可以确认这也适用于本教程的Rails 4版本。