On Feb 23, 2012, at 4:38 PM, Mohamad El-Husseini wrote: > I'm new to RSpec, Rails, and Ruby. I'm following the Rails Tutorial. I was > going over some RSpec code and go wanted some clarification: > > describe "User pages" do > subject { page } > > describe "sign up" do > describe "with valid information" do > before do > fill_in "Name", with: "Mickey Mouse" > fill_in "Email", with: "mic...@disney.com" > fill_in "Password", with: "m1ck3y" > fill_in "Confirmation", with: "m1ck3y" > end > > it "should create a user" do # block 1 > expect { click_button "Sign up" }.to change(User, :count).by(1) > end > > describe "after saving the user" do #block 2 > before { click_button 'Sign up' } > let(:user) { User.find_by_email('mic...@disney.com') } > it { should have_selector('title', text: user.name) } > it { should have_link('Sign out') } > end > end > > Notice the "it 'should create a user'" block. Why doesn't the user we create > in that block carry over to the next block? ("after saving the user")? Why is > it necessary to write > > before { click_button 'Sign up' } in order to test for the user? Shouldn't > the user already exist as it was created in block 2? > > I'm looking to understand the flow of events in RSpec. > > Thanks! > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
Each example (`it`) is run in isolation from the other examples -- there is no shared state. This keeps things clean and easy to understand. In your example, just add a method for "signing up": describe "User pages" do subject { page } describe "sign up" do describe "with valid information" do before do fill_in "Name", with: "Mickey Mouse" fill_in "Email", with: "mic...@disney.com" fill_in "Password", with: "m1ck3y" fill_in "Confirmation", with: "m1ck3y" end def click_sign_up_button click_button "Sign up" end it "should create a user" do # block 1 expect { click_sign_up_button }.to change(User, :count).by(1) end describe "after saving the user" do #block 2 before { click_sign_up_button } let(:user) { User.find_by_email('mic...@disney.com') } it { should have_selector('title', text: user.name) } it { should have_link('Sign out') } end end _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users