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.