Here is a bit of code from M Hartl’s Ruby on Rails Tutorial. Can anyone explain why an instance variable (@user) is necessary and why not use a local variable. Also, since instance variables are supposed to be the variables in the instance of a class, which class is @user instantiated from?
require 'spec_helper'
describe User do
before { @user = User.new(name: "Example User", email: "user@example.com") }
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
end
Use of a local variable in that instance would mean that its scope would be restricted to the
beforeand hence result in an error. The@useris of type User but is an instance variable of thedescribeblock. Rspec has some magic that at run-time makes a class out of eachdescribeblock. Each example (itblock) ends up being a subclass of said class. Class inheritance lets the examples see@user.Edited 2017-05-14
Linked blog post is no longer available. Updating with Wayback Machine link + inlining relevant section here.
Note that this is considered an anti-pattern as detailed in this blog post. Use
letinstead.lethas the following advantages:across examples.