Ruby on Rails に関する Michael Hartl の優れたチュートリアルに従っています。ActionDispatch::Responseの仕組みを理解しようとして困っています。これは、第 9 章の演習 9 (Rails バージョン 3.2.3) から派生しています。
特に、管理者ユーザーが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
ことを意味するのではなく、別のことを意味すると思います。HTTP レスポンス 200/302/400detroy
の違いと関係があると読みましたが、完全にはわかりません。
記録のために、これは私のもの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
@Peter Alfvinの提案に従って2を編集し、行を変更しました
let(:user){FactoryGirl.create(:user)}
に
let(:admin){FactoryGirl.create(:admin)}
そして、すべて一般user
的admin
に。リクエストのputs admin.admin?
前にa も追加しました。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
どちらも役に立たないようです。