Я пишу набор тестов RSpec для наших маршрутов для довольно большого приложения Rails 3. Многие маршруты используют «MATCH», но ни один из них не должен использоваться, тем более, что нам придется переписать их при переходе на Rails 4.
Большинство моих блоков it
выглядят примерно так:
it "with /comments/account/100" do
expect(get("comments/account/100")).to route_to("comments#list", :account_id => "100")
expect(post("comments/account/100")).to route_to("comments#list", :account_id => "100")
expect(put("comments/account/100")).to route_to("comments#list", :account_id => "100")
expect(delete("comments/account/100")).to route_to("comments#list", :account_id => "100")
end
Это кажется немного несухим, чтобы писать бесконечное количество таких блоков. Я хотел бы иметь сопоставитель, который выглядит примерно так:
expect(match_all_verbs("/comments/accounts/100")).to route_to("comments#list", :account_id => "100")
EDIT: окончательная рабочая версия, спасибо Стивену:
def match_all_verbs(path, method, options = {})
[:get, :post, :put, :delete].each do |verb|
expect(send(verb, path)).to route_to(method, options)
end
end
Я добавил хэш options
, чтобы передавать параметры маршрутам. Кажется, все работает нормально.
Ради интереса я сделал match_no_verbs
, чтобы протестировать комбинацию .to_not be_routable
:
def match_no_verbs(path, method, options = {})
[:get, :post, :put, :delete].each do |verb|
expect(send(verb, path)).to_not route_to(method, options)
end
end
Спасибо большое!