Forum: RSpec Attempting to speed up my controller specs: using before all fails?

Posted by nathanvda (Guest)
on 2011-10-11 13:27
(Received via mailing list)
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? Is there a way to circumvent it?
Posted by nathanvda (Guest)
on 2011-10-12 22:52
(Received via mailing list)
Nobody?
Posted by Srushti (Guest)
on 2011-10-12 23:59
(Received via mailing list)
On 12 October 2011 12:09, nathanvda <nathanvda@gmail.com> wrote:

> >       it { response.status.should == 201 }
> >       before (:all) do
> >        @routes is nil: make sure you set it in your test's setup
> http://rubyforge.org/mailman/listinfo/rspec-users
>

I'm afraid I can't help with your specific situation, except to say I've
faced weird issues like this with "before(:all)" in the past, and have
generally tried to stay away from it these days.

Also, the largest amount of time is generally involved in actually 
loading
up rails itself. Can you confirm that there's a significant amount of 
time
taken to execute your controller action?

Srushti
http://c42.in
Posted by David Chelimsky (Guest)
on 2011-10-13 00:15
(Received via mailing list)
On Oct 12, 2011, at 2:09 PM, nathanvda wrote:

>>       it { response.status.should == 201 }
>>       before (:all) do
>>        @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
Posted by Pat Maddox (Guest)
on 2011-10-13 00:24
(Received via mailing list)
Yes it's by design, no you cannot circumvent it. What you can do is use 
mocks to avoid expensive DB hits, or have multiple expectations in a 
single example.

Pat

p.s. This is Ruby, so you absolutely *can* circumvent it. How to do that 
and whether it's worth the trouble is up to you to figure out.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.