私の Rails アプリでは、特定のクエリ文字列値を含むリクエストを非常に高速にブロックする方法が必要でした。高度な制約を使用してルートでこれを行うことができました。現実の世界ではうまく機能しますが、テストの書き方がわかりません。
これが私のroutes.rbのコードです:
class BlockedConstraint
@@block_ids = []
@@block_ids << '12345'
@@block_ids << '67890'
def self.matches?(request)
@@block_ids.include?(request.query_parameters["app_id"])
end
end
namespace :api do
match "*path" => "block#block_request", :constraints => BlockedConstraint
match 'ads' => 'status#get_status', :via => :get
match 'init' => 'init#get_init', :via => :get
#etc.
end
これが私の仕様です:
describe "BlockController" do
it "blocks app_id 12345" do
{ :get => 'api/status', :app_id => '12345' }.should route_to(
:controller => 'api/block',
:action => 'block_request'
)
end
end
しかし、私はこのエラーが発生します:
Failure/Error: { :get => 'api/status', :app_id => '12345' }.should route_to(
Test::Unit::AssertionFailedError:
The recognized options <{"action"=>"get_status", "controller"=>"api/status"}> did not match <{"action"=>"block_request", "controller"=>"api/block"}>, difference: <{"action"=>"block_request", "controller"=>"api/block"}>
また、routing/routes_spec.rb で、Routing を説明してみました。同じ結果です。(実際には、ルーティング スペックとコントローラー スペックのどちらに配置するのが最適かはわかりません。)
Rails 3.0.10 と Rspec 2.11.0 を実行しています。