2012-04-02 10 views
2

Tuckern entlang lernen Rspec, Capybara und FactoryGirl wie Ryan Bates "Wie ich testen" Railscast und einen Haken. Meine App verwendet Devise zur Authentifizierung und CanCan zur Autorisierung. Ich möchte testen, um sicherzustellen, dass ein Benutzer ihre eigenen Beiträge, aber nicht die Beiträge anderer Benutzer löschen kann, aber ich kann nicht scheinen, die Löschung geschehen zu lassen. Ich habe gelesen, dass ich dafür "Controller-Tests" verwenden sollte, aber das Googeln hat nicht viel Licht in die Frage gebracht, worin der Unterschied zwischen diesen und meinen Integrationstests besteht und wie ich diesen Weg gehen könnte.Testen, ob CanCan Zerstörungsmethode mit Rspec, Capybara und FactoryGirl autorisiert?

Hier ist mein Code und darunter, das Ergebnis:

Fabriken:

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 

Ergebnisse von Wache:

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)>' 

Wenn ich tatsächlich save_and_open_page (mit Launchy) sehe ich, dass der Beitrag wurde nicht gelöscht. Irgendwelche Gedanken darüber, wie ich das am besten machen sollte? Vielen Dank!

+1

Wollen Sie wirklich Fähigkeiten über Capybara testen? Es gibt eine Lösung zum Testen von CanCan: https://github.com/ryanb/cancan/wiki/Testing-Abilities – railscard

+0

Das ist schön, danke. Genau das, was ich gesucht habe. Ich musste nicht über Capybara testen, es war nur die einzige Art, wie ich es wirklich wusste. Danke noch einmal. –

Antwort

0

Danke, railscard, für die Lösung:

Sind Sie wollen testen Fähigkeiten über Capybara wirklich? Es gibt eine Lösung zum Testen von CanCan: github.com/ryanb/cancan/wiki/Testing-Abilities