Когда я запускаю это на практике, это работает, но я не могу написать рабочий тест для ограничения маршрута с помощью rspec.
Когда тест выполняется, ограничение срабатывает, но параметры запроса пусты, поэтому он не проверяется и тест не пройден.
Я использую Rails 3.0.9, rspec-rails 2.6.1 и rspec 2.6.0.
конфиг / routes.rb
match ":param1-unique-:param2" => "controller#index",
:constraints => ParamConstraint.new
Библиотека / param_constraint.rb
class ParamConstraint
def matches?(request)
@request ||= request
valid_param1? && valid_param2?
end
def valid_param1?
@request.params[:param1] == "lorem"
end
def valid_param2?
@request.params[:param2] == "ipsum"
end
end
спецификация / маршрутизация / param_constraint_spec.rb
require 'spec_helper'
describe "param constraint routing" do
it "recognizes route for param1 and param2" do
{ :get => "/lorem-unique-ipsum" }.
should route_to(
:controller => "controller",
:action => "index",
:param1 => "lorem",
:param2 => "ipsum"
)
end
end
Обновление
Если я проверяю запрос в ограничении, я получаю следующий вывод:
#<ActionDispatch::Request:0x007fee140ff910 @env={
"rack.version"=>[1, 1],
"rack.input"=>#<StringIO:0x007fee1446da48>,
"rack.errors"=>#<StringIO:0x007fee1446e768>,
"rack.multithread"=>true,
"rack.multiprocess"=>true,
"rack.run_once"=>false,
"REQUEST_METHOD"=>"GET",
"SERVER_NAME"=>"example.org",
"SERVER_PORT"=>"80",
"QUERY_STRING"=>"",
"PATH_INFO"=>"/lorem-unique-ipsum",
"rack.url_scheme"=>"http",
"HTTPS"=>"off",
"SCRIPT_NAME"=>"",
"CONTENT_LENGTH"=>"0"
}>