Пример спецификации для канкана - PullRequest
0 голосов
/ 27 апреля 2011

Я создал набор спецификаций для имеющегося у меня контроллера (Фото), который является вложенным ресурсом Пользователя.Все спецификации проходят, но некоторые из них терпят неудачу, когда я представляю CanCan в контроллере Photos:

load_and_authorize_resource :user
load_and_authorize_resource :photo

Вот неудачный тестовый пример из одной из моих спецификаций:

describe "get 'show'" do
   let(:photo) { Factory.stub(:photo) }
   it "searches for the users photo" do 
      @user.photos.should_receive(:find).with(:photo.object_id); 
      get :show, :user_id => @user.id, :id => :photo.object_id; 
   end
   context "when the photo doesn't exist" do
      before do 
         @user.photos.stub(:find).with(:photo.object_id).and_raise(ActiveRecord::RecordNotFound); 
         get :show, :user_id => @user.id, :id => :photo.object_id;  
      end
      it "assigns photo to nil" do 
         assigns[:photo].should be_nil;  
      end
      it "renders the '404' template" do 
         response.status.should eql 404; 
         response.should render_template("#{Rails.root.to_s}/public/404.html") end
      end
   end
   ...
 end

У меня естьустановите пользователя в верхней части файла спецификации:

login(:user)

before do
   @user = controller.current_user # this could be any user.
   User.stub!(:find).and_return(@user)
end

и метод show в контроллере Photos будет выглядеть следующим образом:

def show
  # @user = User.find(params[:user_id])
  # @photo = @user.photos.find(params[:id])
end

Обратите внимание, что действие пустое, потому что Cancanвыполняет поиск автоматически.До того, как я представил Cancan, две строки в действии не были закомментированы.

В моем тесте, когда я проверяю, например, что метод find вызывается на фотографиях пользователей, тест не проходит.Канкан должен использовать другую технику для поиска фотографий пользователей (кроме @ users.photos.find ()).Кто-нибудь знает, как переписать вышеупомянутые тесты для контроллера, который использует Cancan, т.е. заменить заглушки поиска чем-то, что будет работать?

В идеале я ищу некоторые примеры спецификаций для контроллера RESTful, которыеиспользует канкан.Даже спецификация для действия шоу была бы полезна.

Спасибо за чтение!
Eddie

ps - я использую Rails 3.0.6, Cancan 1.6.4 и Devise 1.3.3

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Для этого есть технический термин, но есть различие в стиле тестирования, когда вы можете написать тест, который определяет реализацию, наш тест, который определяет результат.

Код такой:

@user.photos.should_receive(:find).with(:photo.object_id); 

Объявляет, что способ получения фотографии заключается в использовании операции поиска в ассоциации фотографий.Поскольку это не тот способ, которым cancan загружает фотообъект, это вызывает проблемы в ваших тестах.

Альтернативный подход - определить желаемый результат и оставить реализацию неопределенной в тесте.Это делает тесты менее хрупкими и открывает больше возможностей для рефакторинга кода.

assigns[:photo].should eq photo;

Недостатком этого подхода является то, что он требует использования Фабрики (Factory.create) вместо Fixtures (Factory.stub), но, на мой взгляд, более гибкий стиль тестирования оправдывает это.

0 голосов
/ 17 мая 2011

есть ответ: Rspec, CanCan и Devise , но я не совсем уверен, что хочу установить исправление CanCan. Я бы предпочел понять и правильно разобрать макет. Я знаю, что ключевая проблема заключается в том, что CanCan не вызывает Contact.new (params [: contact]). Вместо этого он вызывает contact.attributes = params [: contact] позже, после применения некоторых начальных атрибутов, основанных на текущих разрешениях способностей. Как обойти это? Вот над чем я сейчас работаю.

...