ruby-on-railsrubydevisecapybarawarden

gem Warden, why do I need scope: in login_as helper?


After looking at somebody else's code I have noticed the following:

login_as user, scope: :user

I have always used simply

login_as user

So I went out to look for an explanation and found this article How to: Test with Capybara that says use scope: :user however without any explanation. All my tests are working fine without it.

Another strange thing is Warden.test_mode! which I am not using either. Why would I need it?

Any explanation?


Solution

  • 1.
    As you can see here, login_as calls set_user with the same set of options.

    Here's the source code of set_user (click "View source"). On line 165, you'll see that if the :scope option is empty, the default scope will be used. In your Rails application, open config/initializers/devise.rb, you'll find something as follows

    # Configure the default scope given to Warden. By default it's the first
    # devise role declared in your routes (usually :user).
    # config.default_scope = :user
    

    It means your default scope is :user which is used when you call login_as without passing a scope.

    2.
    Here's the documentation of Warden.test_mode!

    .test_mode! ⇒ Object

    Provides helper methods to warden for testing.

    To setup warden in test mode call the test_mode! method on warden

    This will provide a number of methods. Warden.on_next_request(&blk) - captures a block which is yielded the warden proxy on the next request Warden.test_reset! - removes any captured blocks that would have been executed on the next request

    Warden.test_reset! should be called in after blocks for rspec, or teardown methods for Test::Unit

    It means if you're sure you won't need/use any of the helper methods provided by warden as listed, not calling this method won't break your tests.