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.

-- 
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/20a56484-7773-49ad-9c13-1299e3a26679%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to