2

私はrspecテストが初めてで、理解できないことがあります。

私を助けることができるなら、私は本当に助けに感謝します。

ファイル構造:

app/models/booking.rb
app/models/user.rb
app/models/role.rb
app/models/ability.rb   

app/controllers/bookings_controller.rb

app/views/bookings/index.html.erb
app/views/dashboard/index.html.erb

app/spec/controllers/bookings_controller_spec.rb

同様の問題でこのリンクを読みましたが、解決されていません

<"index"> を期待しているが <""> でレンダリングする Rspec コントローラー エラー

この行を変更すると、次のようになります。

    it 'should not render index template from bookings' do
        get :index
=>      response.should_not render_template(:index)
    end

この他の場合:

    it 'should not render index template from bookings' do
        get :index
=>      response.should render_template(:index)
    end

リンクと同じ間違いが発生します

<"index"> を想定していますが、<""> でレンダリングします

理由がわからないのですが?これが私のコードです:

私の仕様:

describe BookingsController do
context 'as guest' do
  before(:each) do
    @user = User.new(:email => 'mail_admin@test.com',
                :username => 'admin',
                :password => 'password_admin',
                :password_confirmation => 'password_admin')
    @user.save
    #when i save, with gem CanCan i assign a default role to @user
    #with the default role the user only can see the views/dashboard/index.html.erb
  end

  it 'should not render index template from bookings' do
    get :index
    response.should_not render_template(:index)
  end
end  
end

コントローラ:

class BookingsController < ApplicationController
load_and_authorize_resource

 def index
  ...      
 end

 def show
  ...
 end
end

私のモデル:

class Booking < Activerecord::Base
paginates_per 20

 def 
  ...      
 end

 def 
  ...
 end
end

ユーザー:

Class User < ActiveRecord::Base
  after_save :set_default_role
  rolify
  .
  .
  .
  .
  def set_default_role
   self.add_role :default
  end
end

役割:

class Role < ActiveRecord::Base
 ROLES = {"admin" => "Admin", "default" => "Default"}
 .
 .
 .
 . 
 scopify
end

能力:

class Ability
  include CanCan::Ability

  def initialize(user)
  user ||= User.new
  if user.has_role? :admin
   can :manage, :all
  elsif user.has_role? :data_consistency
   can :read, Booking
  end
 end
end
4

2 に答える 2

1

CanCan は、コントローラー アクションではなく、モデル アクセスを承認します。他のほとんどのアクションでは、これら 2 つは多かれ少なかれ同じものですが、インデックスの場合は異なります。インデックス アクションで、CanCan は、承認制限を含むレコードのクエリにスコープを追加します。

これが意味することは、ゲスト ユーザーは単にレコードを表示できなくなりますが、ビューは引き続きレンダリングされるということです。

必要なのは認証(つまりDevise)であり、認証されたユーザーがアクセスする必要がある各コントローラーの before_filter からそれを使用します。

class BookingsController < ApplicationController
  load_and_authorize_resource # Handles authorization
  before_filter !authenticate_user # Handles authentication (included with Devise)
  ...
end
于 2013-02-15T21:18:14.647 に答える
0

私の場合、問題は before(:each) ブロックで解決されました!
私のコードは次のように機能します:

before :each do
  @user = User.new(:email => 'mail_admin@test.com',
            :username => 'admin',
            :password => 'password_admin',
            :password_confirmation => 'password_admin')
  @user.confirm!
  sign_in @user
end  
于 2013-04-19T18:52:50.277 に答える