On 2011-08-25 11:42 AM, Andrew Premdas wrote:
On 25 August 2011 14:38, Matthias Siegel <matthiassie...@gmail.com <mailto:matthiassie...@gmail.com>> wrote:


    On 25/08/2011, at 11:10 AM, Justin Ko wrote:



    On Wed, Aug 24, 2011 at 6:40 PM, Matthias Siegel
    <matthiassie...@gmail.com <mailto:matthiassie...@gmail.com>> wrote:

        Hi,

        I'm fairly new to RSpec with Rails and I'm trying to work out
        how I can write request specs for resources that require a
        logged in user.

        I can't get this one to pass:


        describe "GET /admin/account" do

         it "should have a 200 status code when logged in" do
           post "/login", { :email => @user.email, :password =>
        @user.password }
           response.should redirect_to("/admin")
           response.code.should eq("302")
           get "/admin/account"
           response.code.should eq("200")
         end

        end


        The login post part works fine and the session gets created
        correctly in the login method, but then the test fails at
        'get "/admin/account"' because the session suddenly is empty.

        I have tried another approach where I set the session
        manually, to simulate a logged in user:


        describe "GET /admin/account" do

         it "should have a 200 status code when logged in" do
           session[:user_id] ||= @user.id <http://user.id/>
           get "/admin/account"
           response.code.should eq("200")
         end

        end


        But again the session arrives empty in my authorisation
        method when trying 'get "/admin/account"'.

        My guess is that it fails because the session relies on
        cookies and in test mode there obviously is no browser and no
        cookie.
        Are there ways to simulate a logged in user in an app that
        creates sessions with cookies?

        Thanks for any suggestions


    What you are doing *should* work. Are there any before_filters
    altering the session? Maybe a gem doing it? Maybe you have an
    admin namespace that calls/uses a different session?


    I have an admin namespace, but does that effect the normal
    'session' object in any way?

    I've done some more tests and setting the session in the RSpec
    code via session[:user_id] =|| @user.id <http://user.id>
    definitely works, however when the GET request starts, the session
    is empty in the application_controller before anything else is
    executed. I still can't figure out where the session gets lost
    between RSpec and the app. I reduced the gems to a minimum set of
    Rails, Mongoid, BCrypt, Mail, RSpec, Cucumber and Factory_Girl,
    but didn't make a difference.

    Forgery protection is disabled for test environment.

    _______________________________________________
    rspec-users mailing list
    rspec-users@rubyforge.org <mailto:rspec-users@rubyforge.org>
    http://rubyforge.org/mailman/listinfo/rspec-users


If you are using Cucumber (which is in your minimal set of Gems), you don't need to write this sort of test. A Cucumber feature will already cover this. RSpec has a wealth of testing tools to cover all sorts of different environments/conditions/styles. This makes it very easy for you to waste time writing tests you don't need. For Rails applications with cucumber and rspec, you only really need to write model specs and features (if you keep your controllers, skinny) *. If a test is difficult to do its always worth thinking, Why am I doing this test? Could I do another test thats easier?

HTH

Andrew

* I don't expect everyone to agree with this

I'm of the same opinion on this issue as you, Andrew. I've been trying for a long time to keep my controllers skinny, and I've recently been thinking that the Cucumber suite should be sufficient for covering them. Like you, though, I expect there are quite a few who disagree. But, hey, so goes life...

Peace.

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to