When to use let
, let!
and before
.
When we want to set a variable that we will later use in the examples.
let(:user) { create :user }
it 'does something to user' do
do_something_to_user(user) # user is initialized here (for example the record is created)
expect(user).to be_stuff
end
it 'is tricky' do
expect(User.count).to eq(0) # we never called `user` so it's not created in this example
end
When we want to set a variable that we will later use in the examples, BUT we want to initialize it right away.
let!(:user) { create :user }
it 'does something to user' do
do_something_to_users(User.all) # We used let!, so the user already exists
expect(user).to be_stuff
end
it 'is less tricky' do
expect(User.count).to eq(1) # the user was created before the example
end
There is a problem in the last example. We use let!
and assign user to a variable, but we never use it.
This pollutes our namespace with unneeded names and makes our tests harder to understand.
If you don’t need access to the variable, simply use before
.
before { create_list :user, 10 }
it 'is simple and clear' do
expect(User.count).to eq(10)
end
Comments
Empty! You must sign in to add comments.