31

この問題についてかなり深く掘り下げた後、ドキュメントの理解と結果の間で行き詰まりに陥りました。

https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/routing-specs/route-to-matcherによると、次のように記述できるはずです。

#rspec-rails (2.8.1)
#rspec (>= 1.3.1)
#rspec-core (~> 2.8.0)

# routing spec
require "spec_helper"

describe BusinessUsersController do
  describe "routing" do
    it "routes to some external url" do
      get("/business_users/7/external_url").should route_to("http://www.google.com")
    end
  end
end

# routes.rb
BizeebeeBilling::Application.routes.draw do

  resources :business_users do
    member do
      get "external_url" => redirect("http://www.google.com")
    end
  end
end

この仕様を実行すると、次の結果が生成されます。

  1) BusinessUsersController routing routes to some external url
     Failure/Error: assert_routing "/business_users/7/external_url", "http://www.google.com"
     ActionController::RoutingError:
       No route matches "/business_users/7/external_url"
     # ./spec/routing/business_users_routing_spec.rb:19:in `block (3 levels) in <top (required)>'

この特定の問題をどこにも報告している人を見つけることができませんでした。

詳細を追加: 手動でテストすると、ルートは完全に解決されます。

4

5 に答える 5

50

ルーティング仕様/テストは、ルートが特定のコントローラーとアクション (および場合によってはいくつかのパラメーター) にマップされているかどうかのテストに特化しています。

Rails と Journey の内部を少し掘り下げました。RSpec と Rails (基本的に、いくつかの詳細は省略されています) はRails.application.routes.recognize_path、「これはルーティング可能ですか?」という質問に答えるために使用します。

例えば:

$レールコンソール
> Rails.application.routes.recognize_path("/business_users/1", メソッド: "GET")
 => {:action=>"show", :controller=>"business_users", :id="1"}

ただし、 の反対側にはコントローラーがありません/business_users/1/external_url。実際、リダイレクトを実行するために、Rails はActionDispatch::Routing::Redirect小さな Rack アプリケーションである のインスタンスを作成しました。Rails コントローラーにはまったく触れていません。基本的に、リダイレクトを実行するために別の Rack アプリケーションをマウントしています。

リダイレクトをテストするには、代わりにリクエスト仕様を使用することをお勧めします ( のファイルspec/requests)。何かのようなもの:

require "spec_helper"

describe "external redirection" do
  it "redirects to google.com" do
    get "/business_users/1/external_url"
    response.should redirect_to("http://www.google.com")
  end
end

これにより、ルートが暗黙的にテストされ、リダイレクトに対してテストできるようになります。

于 2012-06-01T04:26:59.980 に答える
-3

私はあなたがredirect_toマッチャーが欲しいと思います。

于 2012-05-31T23:24:48.523 に答える