Подтвердить что ты не робот

В RSpec, используя допустимую переменную внутри до: all block

В большинстве моих тестов у меня есть следующий код:

describe 'index'
 let(:company) { FactoryGirl.create(:company) }
 let(:user) { FactoryGirl.create(:user, company: company) }

 before do
   sign_in user
   visit products_path
 end
...
end

Но я получаю следующее предупреждение:

WARNING: let declaration 'user' accessed in a 'before(:all)'

Мой вопрос: каков правильный способ сделать это? Я не могу найти много информации о самом предупреждении.

Спасибо!

РЕДАКТИРОВАТЬ: Моя цель - использовать переменную пользователя, чтобы я мог передать ее на sign_in, который подписывает пользователя и использует его позже на других тестах (я проверяю атрибут компании Пользователь)

4b9b3361

Ответ 1

У меня была та же проблема, я решил ее, объявив все мои переменные в качестве атрибутов внутри блока before:

describe 'index'

 before(:all) do
   @company = FactoryGirl.create(:company)
   @user = FactoryGirl.create(:user, company: @company)

   sign_in @user
   visit products_path
 end
...
end

Теперь вы можете использовать @user и @company внутри своих тестов, и у вас не должно быть никаких предупреждений.

Ответ 2

Я не уверен, что вы подразумеваете под "this" в: "Каков правильный способ сделать это"? Доступ к let и subject в пределах before(:all) устарел и будет удален в RSpec 3 со следующим объяснением из https://github.com/rspec/rspec-core/pull/857:

let и subject объявления не предназначены для вызова в before(:all), поскольку они существуют для определения состояния resetмежду каждым примером, а before(:all) существует для определения состояния, которое разделяется между примерами в группе примеров.

Ответ 3

Принимая во внимание ответ Питера, я думаю, что правильным способом является доступ к пользователю в каждом перед каждым блоком:

before(:each) do
  sign_in user
end