Everyday Rails Testing with RSpecという本の例に従って、ログイン ページにリダイレクトするためのカスタム RSpec マッチャー ( requires_loginマッチャー) を作成しました。このマッチャーのコードは次のとおりです。
RSpec::Matchers.define :require_login do
match do |actual|
redirect_to Rails.application.routes.url_helpers.login_path
end
failure_message_for_should do |actual|
"expected to require login to access the method"
end
failure_message_for_should_not do |actual|
"expected not to require login to access method"
end
description do
"redirect to the login form"
end
end
このマッチャーは、次の例で呼び出されます。
describe "GET #edit" do
it "requires login" do
user = FactoryGirl.create(:user)
get :edit, id: user
expect(response).to require_login
end
end # End GET #edit
何らかの理由で、上記のテストは検証されますが、次のテストは検証されません (ログイン パスへのリダイレクトもチェックしますが)。
describe "GET #edit" do
it "requires login" do
user = FactoryGirl.create(:user)
get :edit, id: user
expect(response).to redirect_to login_path
end
end # End GET #edit
上記の本の例と同様に、自分のコードを何度も見直しましたが、エラーは見つかりませんでした。このマッチャーを正しく実現する方法についての洞察をいただければ幸いです。また、Ruby 2.0.0、Rails 3.2.13、および RSpec-Rails 2.13.1 を使用しています。
解決策(Frederick Cheung のアドバイスに感謝)
RSpec::Matchers.define :require_login do |attribute|
match do |actual|
expect(attribute).to redirect_to Rails.application.routes.url_helpers.login_path
end
failure_message_for_should do |actual|
"expected to require login to access the method"
end
failure_message_for_should_not do |actual|
"expected not to require login to access method"
end
description do
"redirect to the login form"
end
end