2010-11-17 27 views
5

estoy empezando un proyecto y me gustaría ser capaz de probar todo :)Rspec, CanCan e idear

y tengo algunos problemas con CanCan e idear.

Por ejemplo, tengo un controlador de contactos. Todos pueden ver y todos (excepto las personas prohibidas) pueden crear contacto.

#app/controllers/contacts_controller.rb 
class ContactsController < ApplicationController 
    load_and_authorize_resource 

    def index 
    @contact = Contact.new 
    end 

    def create 
    @contact = Contact.new(params[:contact]) 
    if @contact.save 
     respond_to do |f| 
     f.html { redirect_to root_path, :notice => 'Thanks'} 
     end 
    else 
     respond_to do |f| 
     f.html { render :action => :index } 
     end 
    end 
    end 
end 

El código funciona, pero yo no sé cómo probar el controlador. Intenté esto. Esto funciona si comento la línea load_and_authorize_resource.

#spec/controllers/contacts_controller_spec.rb 
require 'spec_helper' 

describe ContactsController do 

    def mock_contact(stubs={}) 
    (@mock_ak_config ||= mock_model(Contact).as_null_object).tap do |contact| 
     contact.stub(stubs) unless stubs.empty? 
    end 
    end 

    before (:each) do 
    # @user = Factory.create(:user) 
    # sign_in @user 
    # @ability = Ability.new(@user) 
    @ability = Object.new 
    @ability.extend(CanCan::Ability) 
    @controller.stubs(:current_ability).returns(@ability) 
    end 

    describe "GET index" do 
    it "assigns a new contact as @contact" do 
     @ability.can :read, Contact 
     Contact.stub(:new) { mock_contact } 
     get :index 
     assigns(:contact).should be(mock_contact) 
    end 
    end 

    describe "POST create" do 

    describe "with valid params" do 
     it "assigns a newly created contact as @contact" do 
     @ability.can :create, Contact 
     Contact.stub(:new).with({'these' => 'params'}) { mock_contact(:save => true) } 
     post :create, :contact => {'these' => 'params'} 
     assigns(:contact).should be(mock_contact) 
     end 

     it "redirects to the index of contacts" do 
     @ability.can :create, Contact 
     Contact.stub(:new) { mock_contact(:save => true) } 
     post :create, :contact => {} 
     response.should redirect_to(root_url) 
     end 
    end 

    describe "with invalid params" do 
     it "assigns a newly created but unsaved contact as @contact" do 
     @ability.can :create, Contact 
     Contact.stub(:new).with({'these' => 'params'}) { mock_contact(:save => false) } 
     post :create, :contact => {'these' => 'params'} 
     assigns(:contact).should be(mock_contact) 
     end 

     it "re-renders the 'new' template" do 
     @ability.can :create, Contact 
     Contact.stub(:new) { mock_contact(:save => false) } 
     post :create, :contact => {} 
     response.should render_template("index") 
     end 
    end 

    end 
end 

embargo, estas pruebas fallaron totalmente .... no vi nada en la web ... :( lo tanto, si usted me puede asesorar sobre la forma en que han de seguir, me alegraría a oreja usted :)

Respuesta

6

CanCan no llama al Contact.new(params[:contact]). En su lugar, llama al contact.attributes = params[:contact] más tarde después de haber aplicado algunos atributos iniciales en función de los permisos de capacidad actuales.

Consulte Issue #176 para obtener detalles sobre esto y una solución alternativa. Planeo solucionar esto en la versión 1.5 de CanCan si no antes.

+0

Gracias ryan! ¡Voy a verificar eso! – Arkan

+0

Hola Ryan, he echado un vistazo a tu enlace y gracias a voxik, apliqué su parche y ahora puedo pasar todas mis pruebas. Espero que pronto publiques el parche en una nueva versión de Cancan. Gracias de nuevo ! – Arkan

Cuestiones relacionadas