1

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
4

1 に答える 1

1

match ブロックは、一致したものが一致したかどうかを返す必要がありますが、現時点では、常に真実である何かを返しています。

おそらく、提供されたレールを呼び出し、発生したかassert_redirected_toどうかに応じて true/false を返す 、redirect_to マッチャーと同様のアプローチを取りたいと思うでしょう。ActiveSupport::TestCase::Assertion

于 2013-04-29T11:10:02.173 に答える