2013-08-16 2 views
2

Я написал небольшой тест для проверки параметров перенаправления и URL. Как ни странно тест не пройден, даже если сообщение об ошибке, кажется, указывает результат на самом деле правильно:rspec redirect_to с несколькими параметрами

Failure/Error: response.should redirect_to(movies_path(:sort => 'title')) 

Expected response to be a redirect to 
<http://test.host/movies?sort=title> 
but was a redirect to 
<http://test.host/movies?ratings%5BG%5D=G&ratings%5BNC-17%5D=NC-17&ratings%5BPG%5D=PG&ratings%5BPG-13%5D=PG-13&ratings%5BR%5D=R&sort=title> 

URL-адреса идентичны (так как они должны быть) и ожидаемый параметр «сортировки = название» включено в параметры фактического результата. Я считаю, что это действительная ситуация ...

Acoording to http://api.rubyonrails.org/classes/ActionDispatch/Assertions/ResponseAssertions.html#method-i-assert_redirected_to: «Это совпадение может быть частичным, так что assert_redirected_to (controller:« weblog ») также будет соответствовать перенаправлению redirect_to (controller:« weblog », action : «показать») и т. д. ».

РЕШЕНИЕ: Я не смог получить предложение о выбранном ответе на работу, но ответ был полезен, объяснив, что «частичное» совпадение в приведенной выше ссылке несколько вводит в заблуждение, а код не работает как ожидается. Таким образом, я создал Hash со всеми параметрами, принятыми, и добавил их к «должен redirect_to» тест:

response.should redirect_to(movies_path(:sort => 'title', :ratings => rest)) 

где «отдых» является то, что хэш.

ответ

2

Документация является вводящей в заблуждение. Внутренне, assert_redirected_to вызывает normalize_argument_to_redirection, который (когда хэш указан в качестве аргумента) вызывает url_for перед выполнением сравнения. В принципе, частичное совпадение будет работать только в том случае, если маршрут имеет шаблон по умолчанию :controller/:action/:id, а ваш утверждённый путь - хэш с контроллером или контроллером и действием в качестве ключей.

+0

Думаю, я это понимаю. Я не мог найти, как сделать предложение: «ваш утверждённый путь - это хэш с контроллером или контроллером и действие как ключи», но я смог расширить хэш с отсутствующими параметрами. – jcoppens

+1

Чтобы уточнить, единственные частичные совпадения, которые будут работать: ': controller => 'movies'' или': controller =>' movies ',: action =>' index''. Я не удивлюсь, если документация по этому методу предшествует внедрению названных маршрутов, таких как 'movies_path'. – bgates

+0

Цените объяснение, @bgates. Я пробовал эти комбинации и некоторые другие, но не повезло. Я был несколько вовремя с другими проектами - даже когда в аптеке моей жены была разбита система. Я еще раз проверю позже. Как было отредактировано выше, я сделал finf решение. – jcoppens

1

Вы должны поставить что-то вроде:

response.should redirect_to(movies_path(:sort => 'title', :ratings => "Ratings")) 

Он должен быть полный путь для перенаправления.

+0

Hello Rodrigo. По «полному пути», вы имеете в виду, что все параметры действительно необходимы? Согласно документам rspec, даже с примером, эти частичные совпадения принимаются. Что делать, если я не могу узнать оставшиеся параметры URL-адреса, но должен проверять только один из них? – jcoppens

+0

Думаю, что так. Путь отличается в зависимости от параметров. –

Смежные вопросы