Я следую превосходному руководству Майкла Хартла по Ruby on Rails. Я застрял, пытаясь понять путь ActionDispatch :: Response работает. Это происходит из упражнения 9 главы 9 (Rails версии 3.2.3).Rails response.should be_success никогда не бывает
В частности, нас просят убедиться, что пользователь admin не может сам User#destroy
. У меня есть идея, как это сделать, но поскольку я пытаюсь следовать методологии TDD, я сначала пишу тесты.
Это отношение сниппет в моем тесте:
describe "authorization" do
describe "as non-admin user" do
let(:admin) {FactoryGirl.create(:admin)}
let(:non_admin) {FactoryGirl.create(:user)}
before{valid_signin non_admin}
describe "submitting a DELETE request to the Users#destroy action" do
before do
delete user_path(admin)
#puts response.message
puts response.succes?
end
specify{ response.should redirect_to(root_path) }
specify{ response.should_not be_success }
end
end
#Exercise 9.6-9 prevent admin from destroying himself
describe "as admin user" do
let(:admin){FactoryGirl.create(:admin)}
let(:non_admin){FactoryGirl.create(:user)}
before do
valid_signin admin
end
it "should be able to delete another user" do
expect { delete user_path(non_admin) }.to change(User, :count).by(-1)
end
describe "can destroy others" do
before do
puts admin.admin?
delete user_path(non_admin)
puts response.success?
end
#specify{response.should be_success}
specify{response.should_not be_redirect}
end
describe "cannot destroy himself" do
before do
delete user_path(admin)
puts response.success?
end
#specify{response.should_not be_success}
specify{response.should be_redirect}
end
end
.
.
.
end
Все тесты проходят за исключением теста "can destroy others"
.
Однако, если я puts response.success?
после каждого delete
запроса, я всегда получаю False
, поэтому ни один из запросов «не получится».
Взаимодействующий с webapp и удаляющий пользователей работает очень хорошо, поэтому я предполагаю, что response.success
не означает, что detroy
(или любой другой запрос в этом случае) не был успешным, а что-то еще. Я читал, что он имеет отношение к разнице между HTTP-ответами 200/302/400, но я не совсем уверен.
Для записи, это мой User#destroy
:
def destroy
User.find(params[:id]).destroy
flash[:success]="User destroyed."
redirect_to users_path
end
свет на это? спасибо!
Редактировать
Это моя фабрика:
FactoryGirl.define do
factory :user do
sequence(:name){ |n| "Person #{n}" }
sequence(:email){ |n| "person_#{n}@example.com"}
password "foobar"
password_confirmation "foobar"
factory :admin do
admin true
end
end
end
Edit 2 как предложено @Peter Alfvin, я изменил строки
let(:user){FactoryGirl.create(:user)}
в
let(:admin){FactoryGirl.create(:admin)}
И все user
до admin
в целом. Я также добавил puts admin.admin?
перед запросом delete
. Все еще не работает!
Редактировать 3
Изменение теста "can destroy others"
как:
describe "can destroy others" do
before do
puts admin.admin?
delete user_path(non_admin)
puts response.success?
end
#specify{response.should be_success}
specify{response.should_not be_redirect}
end
ли, кажется, не помогает.
Решение моей проблемы можно найти в следующих статьях: http://stackoverflow.com/a/19013924/1338339 – lllllll