метод rspec let + цикл - PullRequest
       30

метод rspec let + цикл

2 голосов
/ 16 марта 2012

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

  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 - это новый пользовательский экземпляр на каждой итерации цикла, несмотря на запоминание метода current_user.так что, если я добавлю тест для current_user.authorizations.count.should == 3, он потерпит неудачу.

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

1 Ответ

1 голос
/ 28 августа 2012

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

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

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

...