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

Reply via email to