In your first example, last_token is declared in a before block, which means 
you need to mark it as an instance variable of the ExampleGroup '@' to 
reference it in the examples within the context.   You don't need to do that 
when you use let.

Also you don't need to declare the redundant let creating a user in that first 
context, since it was declared outside of the context already.

HTH

Michael

On Mar 13, 2012, at 4:55 PM, Mohamad El-Husseini <husseini....@gmail.com> wrote:

> The following are what I believe two ways of doing the same thing. Only the 
> first example fails, while the latter passes. I'm finding it hard to get to 
> understand describe and context blocks, particularly with respect to scopes. 
> I would appreciate any "for dummies" explanation, or a link to a blog post 
> that can clear this up for me. I'm still new to Rails and Ruby.
> 
>   describe "send password reset" do
>     let(:user) { FactoryGirl.create(:user) }
> 
>     # This fails
>     context "generates a unique password_reset_token each time" do
>       let(:user) { FactoryGirl.create(:user) }
>       before do
>         user.send_password_reset
>         last_token = user.password_reset_token
>         user.send_password_reset
>       end
>       its(:password_reset_token) { should_not == last_token }
>     end
> 
>     # This passes
>     it "generates a unique password_reset_token each time" do
>       user.send_password_reset
>       last_token = user.password_reset_token
>       user.send_password_reset
>       user.password_reset_token.should_not == last_token
>     end
>   end
> 
> The first example fails with this:
> 
> Failure/Error: its(:password_reset_token) { should_not == last_token }
>      NameError:
>        undefined local variable or method `last_token' for 
> #<RSpec::Core::ExampleGroup::Nested_6::Nested_7::Nested_1::Nested_1:0x0000000561e130>
> 
> Earlier, it out puts this:
> 
>  should not When you call a matcher in an example without a String, like this:
> 
> specify { object.should matcher }
> 
> or this:
> 
> it { should matcher }
> 
> RSpec expects the matcher to have a #description method. You should either
> add a String to the example this matcher is being used in, or give it a
> description method. Then you won't have to suffer this lengthy warning again.
>  (FAILED - 1)
> 
> 
> Another thing I noticed is that I can not use capybara inside of describe 
> blocks unless the calls are in a before block... but I don't understand why.
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to