2012-09-07 10 views
6

Ho creato una specifica del controller per il mio modello utente e passa, anche se ho la sensazione che dovrebbe fallire. La specifica è qui sotto:Test controller RSpec - "assegna" comportamento inaspettato

describe UsersController do 
    include Devise::TestHelpers 

    let (:user) do 
    FactoryGirl.create(:user) 
    end 
    let (:other_user) do 
    FactoryGirl.create(:user) 
    end 

    before :each do 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in user 
    end 

    describe "#index" do 
    it "can GET 'index'" do 
     get :index 
     response.should be_success 
    end 

    it "populates a list of users" do 
     get :index 
     expect(assigns(:users)).to eq([user]) 
    end 
    end 
end 

La linea "si aspettano (assegna (utenti):). A eq ([utente])" passa, ma mi sento come se dovesse fallire. Dopo tutto, ho creato due utenti (utente e altro_utente) in alto. Sto chiaramente fraintendendo cosa sta succedendo, quindi qualcuno può spiegarlo?

risposta

7

let è pigro; non creerà l'utente fino alla prima chiamata (a quel punto il risultato è memoized). Poiché si chiama user ma non other_user, viene creato solo il primo utente e la specifica passa.

Utilizzare let! se si desidera una valutazione impaziente o assicurarsi di chiamare da qualche parte lo other_user.

RSpec Documentation

+0

Grazie mille per quello! Mi stava facendo impazzire. – Bryce