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 .