Reputation: 85
I have a failing Rspec test, _pages_spec.rb. I am following Micheal Hartl's Rails Tutorial.
When I have the second "end" at line 83, all tests pass but one:
Failures:
1) User pages signup edit with valid information
←[31mFailure/Error:←[0m ←[31mit { should have_selector('div.alert.alert-suc
cess') }←[0m
←[31mexpected css "div.alert.alert-success" to return something←[0m
←[36m # ./spec/requests/user_pages_spec.rb:77:in `block (5 levels) in <top (
required)>'←[0m
Finished in 1.28 seconds
←[31m60 examples, 1 failure←[0m
Failed examples:
←[31mrspec ./spec/requests/user_pages_spec.rb:77←[0m ←[36m# User pages signup ed
it with valid information ←[0m
Here is the code:
require 'spec_helper'
describe "User pages" do
subject { page }
let (:base_title) {"Tom Gong's Sample App"}
describe "profile page" do
let(:user) { FactoryGirl.create(:user) }
before { visit user_path(user) }
it { should have_selector('h1', text: user.name) }
it { should have_selector('title', text: user.name) }
end
describe "signup page" do
before { visit signup_path }
it { should have_selector('h1', text: 'Sign up') }
it { should have_selector('title', content: "#{base_title} | Sign up") }
end
describe "signup" do
before { visit signup_path }
let (:submit) { "Create my account" }
describe "with invalid information" do
it "should not create a user" do
expect { click_button submit }.not_to change(User, :count)
end
describe "after submission" do
before { click_button submit}
it { should have_selector('title', text: 'Sign up') }
it { should have_content('error') }
end
end
describe "with valid information" do
before do
fill_in "Name", with: "Example User"
fill_in "Email", with: "[email protected]"
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('[email protected]') }
it { should have_selector('title', text:user.name) }
it { should have_selector('div.alert.alert-success', text:'Welcome') }
end
end
describe "edit" do
let(:user) { FactoryGirl.create(:user) }
before { visit edit_user_path(user) }
describe "page" do
it { should have_selector('h1', text: "Update your profile") }
it { should have_selector('title', text:"Edit user") }
it { should have_selector('a', href: 'http://gravatar.com/emails') }
end
describe "with invalid information" do
before { click_button "Save changes" }
it { should have_content('error') }
end
describe "with valid information" do
let(:new_name) { "New Name" }
let(:new_email) { "[email protected]" }
before do
fill_in "Name", with: new_name
fill_in "Email", with: new_email
fill_in "Password", with: user.password
fill_in "Confirm Password", with: user.password
click_button "Save changes"
end
it { should have_selector('title', text: new_name) }
it { should have_selector('div.alert.alert-success') }
it { should have_link('Sign out', href: signout_path) }
specify { user.reload.name.should == new_name }
specify { user.reload.email.should == new_email }
end
end
end
end
Can anyone find the problem?
Upvotes: 0
Views: 112
Reputation: 8482
User pages signup edit with valid information
Here's how it looks like:
User pages
|- signup
|- edit
|- with valid information
It should be
User pages edit with valid information
i.e.
User pages
|- edit
|- with valid information
Currently edit is described under signup. That's not quite right.
I have the second "end" at line 83
It should be right after the line 53 rather than 83. i.e. right before describe "edit" do
.
With consistent indentation you don't need to guess where to put matching end
, it should be obvious from code.
Upvotes: 1
Reputation: 19308
The error message is telling you that the page does not have the selector 'div.alert.alert-success'. It looks like the error is related to this line:
it { should have_selector('div.alert.alert-success', text:'Welcome') }`
Capybara has a nifty method called save_and_open_page
that lets you inspect the HTML file that Capybara parses. Call this method and view the source to inspect the selector that is not working for you. If you are still having trouble, paste the HTML that corresponds to the selector in your question.
You should clean up the formatting of your code because it is very hard to read with the inconsistent spacing and indentation.
Upvotes: 0