Проверяет, разрешает ли CanCan метод уничтожения с помощью Rspec, Capybara и FactoryGirl? - PullRequest
2 голосов
/ 02 апреля 2012

Пыхтя, изучая Rspec, Capybara и FactoryGirl в соответствии с рейн-пакетом Райана Бейтса «Как я тестирую» и попал в ловушку. Мое приложение использует Devise для аутентификации и CanCan для авторизации. Я хотел бы проверить, чтобы убедиться, что пользователь может удалять свои собственные сообщения, но не сообщения других пользователей, но я не могу заставить удаление произойти. Я читал о том, как я должен использовать «тесты контроллера» для этого, но поиск в Google не пролил много света на то, в чем разница между этим и моими интеграционными тестами и как я могу пойти по этому пути.

Вот мой код и, под ним, результат:

Фабрики:

  2 FactoryGirl.define do
  3   factory :role do
  4     factory :admin_role do
  5      name 'admin'
  6     end
  7 
  8     factory :author_role do
  9       name 'author'
 10     end
...
 17   sequence(:name) { |n| "Joe User #{n}"}
 18   sequence(:email) { |n| "joeuser+user#{n}@example.com"}
 19 
 20   factory :user do
 21     name
 22     email
 23     password 'secret'
 24 
 25     factory :admin, :class => User do
 26       name
 27       email
 28       after_create { |user| user.roles << FactoryGirl.create(:admin_role) }
 29     end
 30 
 31     factory :author , :class => User do
 32       name
 33       email
 34       after_create { |user| user.roles << FactoryGirl.create(:author_role) }
 35     end
 36   end
 37 
 38   sequence(:title) { |n| "Post Title #{n}"}
 39   sequence(:body) { |n| "The inner post body #{n}"}
 40 
 41   factory :post do
 42     title
 43     body
 44   end
 45 
 46 end

posts_spec.rb:

  1 require 'spec_helper'                                                                                                                                                                                   
  2 
  3 def login(user)
  4   visit new_user_session_path
  5   fill_in "Email", :with => user.email
  6   fill_in "Password", :with => user.password
  7   click_button "Sign in"
  8   page.should have_content("Signed in successfully")
  9 end
 10 
 11 describe "Posts" do
 12   let(:author) {FactoryGirl.create(:author)}
 13   let(:author2) {FactoryGirl.create(:author)}
 14   let(:user) {FactoryGirl.create(:user)}
 15   let(:admin) {FactoryGirl.create(:admin)}
 16   let(:post) { FactoryGirl.create(:post, user: author) }
...
 99   describe "destroy /post/:id" do
100     it "should allow the author to destroy post" do
101       login(author)
102 
103       visit post_path(post, :method => :delete)
104       lambda {
105         visit post_path(post)                                                                                                                                                                           
106       }.should raise_exception(ActiveRecord::RecordNotFound)
107     end
108   end
109 end

Результаты охраны:

Running: spec/requests/posts_spec.rb
........F

Failures:

  1) Posts destroy /post/:id should allow the author to destroy post
     Failure/Error: lambda {
       expected ActiveRecord::RecordNotFound but nothing was raised
     # ./spec/requests/posts_spec.rb:104:in `block (3 levels) in <top (required)>'

Когда я на самом деле save_and_open_page (используя launchy), я вижу, что сообщение не было удалено. Есть мысли о том, как мне лучше всего это сделать? Большое спасибо!

1 Ответ

0 голосов
/ 26 января 2013

Спасибо, Railscard, за решение:

Вы действительно хотите проверить способности через Капибару? Есть решение о тестировании CanCan: github.com/ryanb/cancan/wiki/Testing-Abilities

...