Для меня это была комбинация комментариев почти всех участников.
Сначала я начал с этого простого теста:
it "routes / to the widgets controller" do
get('/').should route_to("mozoo/widget#index")
end
Это привело к:
Failures:
1) Mozoo::WidgetController GET widget index routes / to the widgets controller
Failure/Error: get('/').should route_to("mozoo/widget#index")
ActionController::RoutingError:
No route matches {:controller=>"mozoo/widget", :action=>"/"}
# ./spec/controllers/mozoo/widget_controller_spec.rb:9:in `block (3 levels) in <module:Mozoo>'
Итак, я переключился с get('/')
на { :get => '/' }
, и все стало отлично работать. Не уверен почему. Согласно lib / rspec / rails / matchers / routing_matchers.rb L102-105 , разницы нет, но для меня это имеет значение. В любом случае, спасибо @ cameron-pope.
Затем я добавил еще один довольно простой и очень похожий тест, описанный выше:
it "routes root_path to the widgets controller" do
{ :get => root_path }.should route_to("mozoo/widget#index")
end
И получал эту ошибку:
Failures:
1) Mozoo::WidgetController GET widget index routes root_path to the widgets controller
Failure/Error: { :get => '/mozoo' }.should route_to("mozoo/widget#index")
No route matches "/mozoo"
# ./spec/controllers/mozoo/widget_controller_spec.rb:14:in `block (3 levels) in <module:Mozoo>'
Итак, я добавил это:
before(:each) { @routes = Mozoo::Engine.routes }
И получилось лучше / другая ошибка:
Failures:
1) Mozoo::WidgetController GET widget index routes root_path to the widgets controller
Failure/Error: { :get => root_path }.should route_to("mozoo/widget#index")
The recognized options <{"controller"=>"mozoo/widget", "action"=>"index", "section"=>"mozoo"}> did not match <{"controller"=>"mozoo/widget", "action"=>"index"}>, difference: <{"section"=>"mozoo"}>.
<{"controller"=>"mozoo/widget", "action"=>"index"}> expected but was
<{"controller"=>"mozoo/widget", "action"=>"index", "section"=>"mozoo"}>.
# ./spec/controllers/mozoo/widget_controller_spec.rb:14:in `block (3 levels) in <module:Mozoo>'
Оттуда я изменил свой тест, включив в него раздел (пространство имен, под которым находится мой движок):
{ :get => root_path }.should route_to(:controller => "mozoo/widget", :action => "index", :section => "mozoo")
И альт, это прошло. Спасибо, Стивен-Андерсон.
Следующая часть странная. После добавления еще одного теста для определенного виджета, который использовал помощника url widget_path для именованного маршрута:
it "will successfully serve the widget show page" do
visit widget_path(:foobar)
response.should be_success
end
На меня сразу взорвался тест:
Failures:
1) GET bubble_summary_row widget will have the content section properly scoped
Failure/Error: visit widget_path(:bubble_summary_row)
NoMethodError:
undefined method `widget_path' for #<RSpec::Core::ExampleGroup::Nested_3:0x0000010748f618>
# ./spec/views/mozoo/widgets/show.html.haml_spec.rb:7:in `block (2 levels) in <module:Mozoo>'
Поэтому я добавил следующую запись конфигурации spec_helper:
RSpec.configure do |config|
config.include Testy::Engine.routes.url_helpers
end
И БАМ! Это прошло. Спасибо @ sam-soffes. Что делает это странным, так это то, что позже при создании этого комментария я удалил эту запись конфигурации, чтобы попытаться вернуть ошибку, и мне не удалось воспроизвести ошибку, просто удалив запись конфигурации. О, хорошо, я иду дальше. Надеюсь, этот скучный аккаунт кому-нибудь поможет.