ruby-on-railsrubyruby-on-rails-3rspecinstance-variables

How do instance variables in rspec work?


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

Solution

  • Use of a local variable in that instance would mean that its scope would be restricted to the before and hence result in an error. The @user is of type User but is an instance variable of the describe block. Rspec has some magic that at run-time makes a class out of each describe block. Each example (it block) 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 let instead.

    let has the following advantages: