9

Rails アプリに「Photo」という RESTful リソースがあります。私はPaperclipを使用して写真のさまざまな「スタイル」(サムネイルなど) を提供しており、カスタム ルートを使用してそれらのスタイルに RESTful にアクセスしています。

map.connect "photos/:id/style/*style", :controller => "photos", :action => "show"

それはうまくいっていますが、それがそのままであることを確認するためのテストを書きたいと思います。

Photo コントローラーの show アクションを呼び出す機能テストが既にあります (実際には scaffold によって生成されます)。

test "should show photo" do
  get :show, :id => photos(:one).to_param
  assert_response :success
end

URL「/photo/1」でのアクションの実行をテストします。ここで、URL "/photo/1/style/foo" の実行をテストしたいと思います。残念ながら、ActionController::TestCase をその URL にヒットさせることはできないようです。get メソッドは常にアクション/ID を必要とし、URL サフィックスを受け入れません。

カスタム URL をテストするにはどうすればよいですか?

アップデート

@fernybの回答を確認しているときに、同じrdocでこのスニペットを見つけました

テストでは、URL または名前付きルートを渡すだけで取得または投稿できます。def send_to_jail get '/jail' assert_response :success assert_template "jail/front" end

しかし、実際に試してみると、次のエラー メッセージが表示されます。

test "should get photo" do
  get "/photos/1/style/original"
  assert_equal( "image/jpeg", @response.content_type )
end  

ActionController::RoutingError: No route matches {:action=>"/photos/1/style/original", :controller=>"photos"}

私は何か間違ったことをしているのだろうか。

4

2 に答える 2

5

assert_routingルートをテストするために使用します。

assert_routing("/photos/10/style", :controller => "photos", :action => "show", :id => "10", :style => [])

assert_routing("/photos/10/style/cool", :controller => "photos", :action => "show", :id => "10", :style => ["cool"])

assert_routing("/photos/10/style/cool/and/awesome", :controller => "photos", :action => "show", :id => "10", :style => ["cool", "and", "awesome"])

統合テストでは、次のことができます。

test "get photos" do
   get "/photos/10/style/cool"
   assert_response :success
end
于 2009-11-01T03:42:10.037 に答える
1

Rails API ドキュメントから:

ルートグロビング

*[string]次のようなルールの一部として指定します。

map.connect '*path' , :controller => 'blog' , :action => 'unrecognized?'

以前に認識されなかったルートの残りの部分をすべてグロブします。グロブ化された値は、 params[:path]パス セグメントの配列として存在します。

:pathしたがって、アクションを正しくテストするには、引数を渡す必要があるようです。

于 2009-11-01T03:39:41.950 に答える