Пыхтя, изучая 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), я вижу, что сообщение не было удалено. Есть мысли о том, как мне лучше всего это сделать? Большое спасибо!