On Friday, May 30, 2014 11:25:31 AM UTC+2, Javix wrote:
>
>
>
> On Friday, May 30, 2014 11:13:48 AM UTC+2, Javix wrote:
>>
>> I'm coming back to the question regarding how to set up cookies values
>> and read in RSpec controllers spec.
>> So following the Michael Hartl's Rails Tutorial
>> <http://www.railstutorial.org/book>, I tries to write a controller spec.
>> Michael still uses 'the old' way and put controllers specs in requests
>> folder and requires Capybara in spec_helper:
>>
>> #config.include Capybara::DSL
>>
>> I commented the above line as Capybara DSL will be used in features specs
>> and will be loaded without problems.
>>
>> So, I'd like just to set in some way cookies.permanent and do it in a
>> separate module (spec/support:/login_macros.rb):
>>
>> module LoginMacros
>> def set_admin_session(admin)
>> cookies.permanent['remember_token'] = admin.remember_token
>> end
>> end
>>
>> Then I included the module in spec_helper:
>>
>> config.include LoginMacros
>>
>> In my ClientsControllerSpec:
>>
>> describe ClientsController do
>> let(:admin) { create(:admin) }
>>
>> before { set_admin_session(admin) }
>>
>> describe 'GET #index' do
>> it "populates an array of all clients" do
>> clients = []
>> 3.times do
>> clients << create(:client)
>> end
>>
>> get :index
>> expect(assigns(:clients)).to match_array(clients)
>> end
>> end
>> end
>>
>> ClientController:
>>
>> class ClientsController < ApplicationController
>> before_action :signed_in_user
>>
>> def index
>> @clients = Client.paginate(page: params[:page])
>> end
>> end
>>
>> Here is 'signed_in_user' method in SessionsHelper:
>>
>> module SessionsHelper
>> def sign_in(user)
>> remember_token = Admin.new_remember_token
>> cookies.permanent[:remember_token] = remember_token
>> user.update_attribute(:remember_token, Admin.digest(remember_token))
>> self.current_user = user
>> end
>>
>> def signed_in_user
>> unless signed_in?
>> store_location
>> redirect_to signin_path, notice: t(:sign_in_required)
>> end
>> end
>>
>> end
>>
>> Here are the errors when running the specs:
>>
>> ClientsController
>> GET #index
>> populates an array of all clients (FAILED - 1)
>> renders the :index template (FAILED - 2)
>>
>> Failures:
>>
>> 1) ClientsController GET #index populates an array of all clients
>> Failure/Error: expect(assigns(:clients)).to match_array(clients)
>> expected an array, actual collection was nil
>> # ./spec/controllers/clients_controller_spec.rb:16:in `block (3
>> levels) in <top (required)>'
>>
>> 2) ClientsController GET #index renders the :index template
>> Failure/Error: expect(response).to render_template :index
>> expecting <"index"> but rendering with <[]>
>> # ./spec/controllers/clients_controller_spec.rb:21:in `block (3
>> levels) in <top (required)>'
>>
>> What is wrong here ? Why cookies are not set correctly ?
>> Thank you.
>>
>> Found WHY it did not work.
> I had to just sign in the admin user in my LoginMacros and include the
> corresponding helper (SessionsHelper):
>
> include SessionsHelper
>
> module LoginMacros
> def set_admin_session(admin)
> sign_in(admin)
> end
> end
>
> In ClientsControllerSpec :
>
> require 'spec_helper'
>
> describe ClientsController do
> let(:admin) { create(:admin) }
>
> before { set_admin_session(admin) }
>
> describe 'GET #index' do
> it "populates an array of all clients" do
> clients = []
> 3.times do
> clients << create(:client)
> end
>
> get :index
> expect(assigns(:clients)).to match_array(clients)
> end
>
> it "renders the :index template" do
> get :index
> expect(response).to render_template :index
> end
> end
>
> Hope this helps.
>
Even better, correct me if I'm wrong.
No need to add an additional hook (LoginMacros module) because
SessionsHelper beign included in my ApplicationController, is automatically
accessible in controller specs.
It means that I culd just call SessionsHelper 'sign_in method directly in
my ClientControllerSpec:
require 'spec_helper'
describe ClientsController do
let(:admin) { create(:admin) }
before { sign_in(admin) }
...
end
and remove the include of LoginMacros module in spec_helper config blolck.
VoilĂ :)
--
You received this message because you are subscribed to the Google Groups
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rspec/66198f12-fbed-4d72-835c-1e0b60ff3ab4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.