У меня возникли проблемы с запуском моих примеров 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) }
сохраняться в одном экземпляре пользователя во всех примерах?
Благодарим вас за этот ответ. Что мне было непонятно, прежде чем вы сказали, что это предложение: 'let' запоминает возвращаемое значение в каждом примере' it', но выполняет блок каждый раз, когда он вызывается в первый раз в примере. – Francois