I have the following code inside most of my tests:
describe 'index'
let(:company) { FactoryGirl.create(:company) }
let(:user) { FactoryGirl.create(:user, company: company) }
before do
sign_in user
visit products_path
end
...
end
But I'm getting the following warning:
WARNING: let declaration 'user' accessed in a 'before(:all)'
My question is, what is the correct way of doing this? I can't find much information about the warning itself.
Thanks!
EDIT: My goal is to use the user variable so I can pass it on to sign_in, which signs the user in, and use it later on another tests (I check for the company attribute of the User)
I had the same problem, I have solved it by declaring all my variables as attributes inside the before
block:
describe 'index' before(:all) do @company = FactoryGirl.create(:company) @user = FactoryGirl.create(:user, company: @company) sign_in @user visit products_path end ... end
Now you can use @user
and @company
inside your tests, and you shouldn't have any warnings.
I'm not sure what you mean by "this" in "what is the correct way of doing this"? Accessing let
and subject
within a before(:all)
is deprecated and will be removed in RSpec 3 with the following explanation from https://github.com/rspec/rspec-core/pull/857:
let
andsubject
declarations are not intended to be called in abefore(:all)
hook, as they exist to define state that is reset between each example, whilebefore(:all)
exists to define state that is shared across examples in an example group.
Taking into account Peter's answer I think the correct way is to access the user in a before each block:
before(:each) do
sign_in user
end
来源:https://stackoverflow.com/questions/19670375/in-rspec-using-let-variable-inside-before-all-block