If you’ve been writing RSpec for any period of time I’m sure you’ve come across let and subject. (please take a moment to check out the links if you have no idea what I’m talking about) In most cases you can write the same specs with instance variables. For example:
describe '.find_good_cars' do
before do
@car_1 = Factory(:good_car)
@car_2 = Factory(:good_car)
@car_3 = Factory(:bad_car)
@good_cars = Car.find_good_cars
end
it 'only finds good cars' do
@good_cars.should eq [@car_1, @car_2]
end
end
Here is what it looks like when using let
and subject
describe '.find_good_cars' do
let!(:car_1) { Factory(:good_car) }
let!(:car_2) { Factory(:good_car) }
let!(:car_3) { Factory(:bad_car) }
subject { Car }
its(:find_good_cars) { should eq [car_1, car_2] }
end
Maybe it is just me but this feels cleaner. I treat instance variables in my specs as a smell and you should too.