Rails link_to not found Capybara
_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 Error:
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))' After creating the user process manually, it works. The link is in the drop-down menu, if, perhaps, this can have something to do with it? This is in place in the MHartl rails manual, where he says that all tests should pass.
+4
3 answers
The code of the suspect, apparently, should be nested inside within the previous description
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 +11
The before block in the last description has not created a user yet. This is why a user (who does not exist yet) is not currently signed up, so there is no "exit" link.
One possible solution is click_button 'submit' in the previous block. Another is to skip the character in the before block at all, because at this point the user has not signed.
+3