Rspec + Devise + BaseController

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.

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.