В 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, который подписывает пользователя и использует его позже на других тестах (я проверяю атрибут компании Пользователь)
Ответы
Ответ 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