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.




-- 
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/a5eebc3d-482a-4ea9-92bf-9c3558307574%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to