代码之家  ›  专栏  ›  技术社区  ›  Arkan

Rspec、CanCan和designe

  •  5
  • Arkan  · 技术社区  · 14 年前

    我正在启动一个项目,我希望能够测试一切:)

    我和坎坎还有一些问题。

    例如,我有一个控制器触点。每个人都可以查看,每个人(被禁止的人除外)都可以创建联系人。

    #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
    

    代码可以工作,但我不知道如何测试控制器。 我试过了。如果我对“加载”和“授权”资源行进行注释,则此操作有效。

    #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
    

    但是这些测试完全失败了。。。。 我在网上什么也没看到。。。:( 所以,如果你能告诉我该怎么做,我很乐意听你说:)

    1 回复  |  直到 14 年前
        1
  •  6
  •   ryanb    14 年前

    坎坎不打电话 Contact.new(params[:contact]) . 相反,它调用 contact.attributes = params[:contact] 稍后,它将基于当前能力权限应用一些初始属性。

    Issue #176 有关此问题的详细信息和其他解决方案。我计划尽快在CanCan 1.5版中修复这个问题。