Forum: RSpec Rspec + Devise + BaseController

375b7e3e6b2365fdd0f127f4e224f4dc?d=identicon&s=25 Ezequiel Delpero (edelpero)
on 2013-03-20 18:00
Hello there,

I'm creating a base controller for the admin section of a project. All
controllers whitin the admin section will inherit from it.

#####################################################
#app/controllers/admins/base_controller.rb

class Admins::BaseController < ApplicationController
  layout "admin_cms"
  before_filter :authenticate_admin!
end

#####################################################

#spec/controllers/admins/base_controller_spec.rb

require 'spec_helper'

describe Admins::BaseController do
  controller do
    def index
    end
  end

  describe "before_filter#authenticate_admin!" do
    before(:each) do
      @admin = FactoryGirl.create(:admin)
      @request.env["devise.mapping"] = Devise.mappings[:admin]
    end

    context "when admin is not logged in" do
      it "redirect admin to sign_in path" do
        get :index
        response.should redirect_to new_admin_session_path
      end
    end

  end
end

#####################################################

I've already inclueded Devise::TestHelpers on my spec_helper.rb and I'm
getting this error when running this spec:

#####################################################

Admins::BaseController
  before_filter#authenticate_admin!
    when admin is not logged in
      redirect admin to sign_in path (FAILED - 1)

Failures:

   1) Admins::BaseController before_filter#authenticate_admin! when
admin is not logged     in redirect admin to sign_in path
     Failure/Error: get :index
     ActionView::MissingTemplate:
       Missing template anonymous/index, application/index with
{:locale=>[:en],     :formats=>[:html], :handlers=>[:erb, :builder,
:coffee]}. Searched in:
         *
"#<RSpec::Rails::ViewRendering::EmptyTemplatePathSetDecorator:0xbaf75d4>"
     # ./spec/controllers/admins/base_controller_spec.rb:17:in `block (4
levels) in <top (required)>'

Finished in 0.17124 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/admins/base_controller_spec.rb:16 #
Admins::BaseController   before_filter#authenticate_admin! when admin is
not logged in redirect admin to sign_in path

#####################################################

I changed my spec to this:

#####################################################

require 'spec_helper'

describe Admins::BaseController do
  controller do
    def index
      render nothing: true
    end
  end

  describe "before_filter#authenticate_admin!" do
    context "when admin is not logged in" do
      it "redirect admin to sign_in path" do
        get :index
        response.should redirect_to new_admin_session_path
      end
    end

  end
end

#####################################################

and now I'm getting this error:

#####################################################

Failures:

  1) Admins::BaseController before_filter#authenticate_admin! when admin
is not logged in redirect admin to sign_in path
     Failure/Error: response.should redirect_to new_admin_session_path
       Expected response to be a <:redirect>, but was <200>
So, for some reason it's not entering in the authenticate_admin! before
filter. I'm kind of lost. Thanks again.

#####################################################

I'm using Rails 3.2.13, Ruby 2.0.0, Rspec-rails 2.13.0 and Devise 2.2.3.
I really appreacite if someone could help me out with this. Thanks in
advance.
375b7e3e6b2365fdd0f127f4e224f4dc?d=identicon&s=25 Ezequiel Delpero (edelpero)
on 2013-03-20 19:21
Finally I could solve the problem. The problem was on the definition of
the anonymous controller on the spec:

instead of:

    controller do
      def index
      end
    end

I used:

    controller(Admins::Base) do
      def index
      end
    end

You need to specify always the anonymous controller you're testing
unless is ApplicationController the one you're trying to test.
This topic is locked and can not be replied to.