2012-03-16 2 views
2

У меня возникли проблемы с запуском моих примеров rspec в цикле.rspec let method + loop

describe "GET all providers" do 
    let(:current_user) { Factory(:user) } 

    [:twitter, :facebook, :google_oauth2].each do |provider| 
     before :each do 
     current_user.confirm! 
     sign_in current_user 

     request.env['devise.mapping'] = Devise.mappings[:user] 
     request.env["omniauth.auth"] = OmniAuth.config.add_mock provider, { 
      :uid => '123456789', 
      :info => { 
      :email => current_user.email 
      } 
     } 
     end 

     it 'should add the authorization' do    
     get provider # method to create the authorization 
     authorization = Authorization.where(:provider => request.env["omniauth.auth"][:provider], :uid => request.env["omniauth.auth"][:uid]).first 
     current_user.authorizations.should include authorization 
     end 
    end 
    end 

В настоящее время все эти примеры проходят. проблема в том, что current_user является новым пользовательским экземпляром через каждую итерацию цикла, несмотря на то, что memoizing метод current_user. поэтому, если я добавлю тест для current_user.authorizations.count.should == 3, он терпит неудачу.

Это стало менее необходимым для фактического тестирования, и больше понимания, почему оно не ведет себя так, как я ожидаю. не должен let(:current_user) { Factory(:user) } сохраняться в одном экземпляре пользователя во всех примерах?

ответ

1

Вот суть я придумал, что может помочь вам понять let и let!: https://gist.github.com/3489451

let memoizes возвращаемого значения в пределах каждого it например, но выполняет блок каждый раз, когда он вызывается в первый раз в примере.

Например, если вы вызываете current_user в первый раз в блок примера it, выполняется блок { Factory(:user) }. Вызов current_user второй или любое последующее время в одном и том же блоке примера it не выполняет блок { Factory(:user) }; возвращаемое значение запоминается.

+0

Благодарим вас за этот ответ. Что мне было непонятно, прежде чем вы сказали, что это предложение: 'let' запоминает возвращаемое значение в каждом примере' it', но выполняет блок каждый раз, когда он вызывается в первый раз в примере. – Francois