質問

私はプロジェクトを開始していると私は、テストのすべてのことができるようにしたいと思います:)

と私はカンカンと工夫のいくつかの問題を持っています。

exempleのために、私は、コントローラの連絡先を持っています。誰もが見ることができますし、誰もが(exceptsでは、人々を禁止)連絡先を作成することができます。

#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

コードの作品は、私はどのようにコントローラをテストしていません。 私はこれを試してみました。この作品、私は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
しかし、これらのテストは完全に失敗した.... 私は、ウェブ上で何も見なかった... :( あなたは私が従わなければならない道で私に助言することができればそう、私は耳あなたに喜んでいるだろう:)

役に立ちましたか?

解決

カンカンはContact.new(params[:contact])を呼び出すことはありません。それは、現在の能力の権限に基づいて、いくつかの初期の属性を適用した後、その代わりに、後でcontact.attributes = params[:contact]を呼び出します。

は、この代替ソリューションの詳細については、問題#176 のを参照してください。私は早くカンカンバージョン1.5で、これは固定を取得することを計画している場合ではない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top