[rspec-users] Attempting to speed up my controller specs: using before all fails?

David Chelimsky dchelimsky at gmail.com
Wed Oct 12 17:14:32 EDT 2011


On Oct 12, 2011, at 2:09 PM, nathanvda wrote:

> Nobody?
> 
> On Oct 11, 1:05 pm, nathanvda <nathan... at gmail.com> wrote:
>> I have a simple controller test, containing a.o. the following code:
>> 
>>     context "POST :create" do
>>       before (:each) do
>>         post :create, :user_id => @user.id,
>>              :account => { .. some data ... }
>>       end
>>       it { response.status.should == 201 }
>>       it { response.location.should be_present }
>>     end
>> 
>> Now I thought of a very simple way to speed up this test, and to use a
>> `before(:all)` instead of a `before(:each)`. In that case the POST
>> would only be done once.
>> 
>> So i wrote:
>> 
>>     context "POST :create" do
>>       before (:all) do
>>         post :create, :user_id => @user.id,
>>              :account => { .. some data ... }
>>       end
>>       it { response.status.should == 201 }
>>       it { response.location.should be_present }
>>     end
>> 
>> But then I get the following errors:
>> 
>>      RuntimeError:
>>        @routes is nil: make sure you set it in your test's setup
>> method.
>> 
>> Is this by design?

Yes. rspec-rails wraps the rails' testing framework which doesn't have a before(:all) concept in it, so all the data is reset before each example. Even if we wanted to support this in rspec-rails (which I don't) it would require changes to rails first.

>> Is there a way to circumvent it?

Not really. I'd just stick them in a single example:

describe "POST create" do
  it "responds with a 201 and a location" do
    post :create, :user_id => @user.id, :account => { .. some data ... }
    response.status.should eq(201)
    response.location.should be_present
  end
end

This violates the "one expectation per example" guideline, but a) that's just a guideline, and b) the real benefit of following the guideline is that it tends to limit you to one event per example (which is a GOOD thing). If that event has multiple outcomes to check, however, I see little benefit in this guideline.

HTH,
David


More information about the rspec-users mailing list