Rails 3: Как создать спецификации контроллера rspec при использовании автоматической загрузки ресурсов cancan? - PullRequest
2 голосов
/ 09 ноября 2011

Я что-то здесь упускаю ....

Cancan имеет удобную функцию для автоматической загрузки ваших ресурсов:

(взято из https://github.com/ryanb/cancan/wiki/Authorizing-Controller-Actions)

def index
  # @products automatically set to Product.accessible_by(current_ability)
end

За исключением того, что я не могу понять, как заставить это работать в моих спецификациях контроллера rspec ...

Это, наверное, очень просто, и сейчас я просто измучен. : P В любом случае, это происходит от функции cancan load_and_authorize_resource.

Идеи? Спасибо!

1 Ответ

1 голос
/ 21 июля 2012

Лучший способ протестировать этот контроллер - это заглушка метода current_user.

Например, у нас есть модель Product и контроллер Products.

class Product < ActiveRecord::Base 
end

class ProductsContoller < ApplicationController
  load_and_authorize_resource

  def index
  end

end

# allow access to Product only for admin user
class Ability
  include CanCan::Ability

  def initialize(user)

    user ||= User.new

    if user.admin?
      can :manage, Product
    end  

  end
end


# stubbing current_user method
module ControllersHelper
  def current_user!(user)
    raise "argument not valid" unless user.is_a?(User)
    controller.stub!(:current_user).and_return(user)
  end
end

# and include this method to rspec config
Spec::Runner.configure do |config|
  config.include ControllersHelper, :type => :controller
end


describe ProductsContoller do
  before do
    current_user!(user)
  end
  let(:user) { Factory(:user) }

  describe "GET index" do

    describe "for admin users" do
      before do
        user.update_attribute(:admin, true)
      end  

      it "should find .products tag" do
        get products_path
        response.should have_tag ".products"
      end  
    end  

    describe "for guest users" do
      it "should find .products tag" do
        get products_path
        response.should_not be_success
      end  
    end
  end
end
...