Testando controladores anônimos com RSpec

Ultimamente, tenho trabalhado em um projeto no qual precisava testar se em todo o cms do meu administrador é necessário que o administrador seja autenticado. Eu estava usando o devise para lidar com a autenticação e se você já trabalhou com o devise sabe que é tão simples quanto adicionar um filtro before : authenticate admin !.

Como você imagina, adicionar esse before_filter a cada um dos controladores cms do meu administrador é uma chatice e também seria uma má ideia. Decidi então criar um Admins :: BaseController que herda de ApplicationController .

class Admins::BaseController < ApplicationController

before_filter
:authenticate_admin!

end

Até agora é um pedaço de bolo. Agora queremos testar nosso novo Admins :: BaseController , e nossa especificação deve ser semelhante a esta:

require 'spec_helper'

describe
Admins::BaseController do

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

describe
"#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
"redirects admin to sign_in path" do
get :index
response
.should redirect_to new_admin_session_path
end
end
end

end

Note que logo após definirmos Admins :: BaseController fazemos uma chamada ao método do controlador e passamos como argumento nosso controlador. Dentro do método do controlador, temos que definir o método que iremos testar ou usar para testar nosso controlador base.

Outra coisa importante é que se você está testando ApplicationController , não precisa passar o nome do controlador como um argumento para o método do controlador.

Você pode encontrar mais informações sobre isso aqui .