Все примеры маршрутизации терпят неудачу для движка Rails 3.2 с RSpec 2.10

Я создал Rails Engine в обычном режиме, установил RSpec, и создал основу для модели, но я не могу передать какие-либо спецификации маршрутизации.

Вот один пример:

describe Licensing::LicensesController do
  it 'routes to #index' do
    get('/licensing/licenses').should route_to('licensing/licenses#index')
  end
end

Я запускаю примеры в фиктивном приложении следующим образом:

$ cd spec/dummy
$ rake spec
/Users/brandan/.rvm/rubies/ruby-1.9.3-p194/bin/ruby -S rspec ../routing/licensing/licenses_routing_spec.rb
F

Failures:

  1) Licensing::LicensesController routes to #index
     Failure/Error: get('/licensing/licenses').should route_to('licensing/licenses#index')
       No route matches "/licensing/licenses"
     # /Users/brandan/repos/licensing/spec/routing/licensing/licenses_routing_spec.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.04345 seconds
1 example, 1 failure

Двигатель установлен в фиктивном приложении правильно:

# spec/dummy/config/routes.rb
Rails.application.routes.draw do
  mount Licensing::Engine => "/licensing"
end

И я могу войти в фиктивное приложение, запустить консоль и получить этот маршрут в полном порядке:

1.9.3p194 :001 > app.get('/licensing/licenses')
  Licensing::License Load (0.3ms)  SELECT "licensing_licenses".* FROM "licensing_licenses" 
200
1.9.3p194 :002 > app.response.body
"<!DOCTYPE html>..."

Есть некоторое несоответствие между фиктивным приложением и RSpec, и я не могу понять, что это такое. Я нашел несколько статей, в которых утверждается, что эта проблема решена, но ни одна из них не помогла, и некоторые из них относятся к Rails 3.1:

Кто-нибудь решил эту проблему в Rails 3.2 / RSpec 2.10?


person Brandan    schedule 20.07.2012    source источник
comment
Я предполагаю, что вы тестируете фиктивное приложение, которое интегрирует ваш движок. Вы уверены, что движок установлен в маршрутах фиктивного приложения? Если да, уверены ли вы, что ваша спецификация :type => :routing?   -  person Tanzeeb Khalili    schedule 02.08.2012
comment
@TanzeebKhalili Я уверен, что маршруты верны, потому что они работают в консоли и в браузере. Я запускаю спецификации из фиктивного приложения. Файлы находятся под spec/routing, и явное указание :type => :routing также не приводит к передаче примеров. Есть еще идеи? : - /   -  person Brandan    schedule 02.08.2012
comment
Как насчет следующих изменений: 1) Другой описываемый объект: describe "the routes" do ... и 2) Другой синтаксис: { :get => '/licensing/licenses' }.should be_routable   -  person Tanzeeb Khalili    schedule 03.08.2012
comment
@TanzeebKhalili К сожалению, ни один из них не помог. Я нашел обсуждение на GitHub, которое, похоже, указывает на то, что это проблема с Rails. а не RSpec, но решения все равно нет.   -  person Brandan    schedule 03.08.2012


Ответы (2)


Обновление (31 октября 2013 г.)

RSpec 2.14 теперь полностью поддерживает движок маршруты:

module MyEngine
  describe ExampleController do
    routes { MyEngine::Engine.routes }
  end
end

Добавьте его во все спецификации маршрутизации:

# spec/spec_helper.rb
config.include Module.new {
  def self.included(base)
    base.routes { Reportr::Engine.routes }
  end 
}, type: :routing

Лучшее решение, которое мне удалось найти до сих пор, - это явная установка набора маршрутов, который будет использоваться во время тестов:

RSpec.configure do |config|
  config.before(:each, type: :controller) { @routes = Licensing::Engine.routes }
  config.before(:each, type: :routing)    { @routes = Licensing::Engine.routes }
end

Затем мне пришлось переписать мои примеры маршрутизации, чтобы опустить пространство имен:

it 'routes to #index' do
  get('/licenses').should route_to('licensing/licenses#index')
end

Это похоже на хитрость, но в этом есть смысл. Я не проверяю, может ли Rails смонтировать движок на определенном пути. Я только проверяю, что мой движок правильно настроил свои собственные маршруты. Тем не менее, я бы предпочел не перезаписывать переменную экземпляра, чтобы это произошло.

Вот еще пара хороших тем по этой теме:

person Brandan    schedule 11.08.2012
comment
да, и есть маршруты {Licensing :: Engine.routes} для его замены: вы можете добавить это в спецификацию, но мне просто нужно найти решение, чтобы добавить это во все спецификации контроллера двигатель... - person mugwump; 15.11.2013
comment
@mugwump Я добавил пример, показывающий, как сразу включить маршруты для всех спецификаций маршрутизации в spec_helper.rb. - person Brandan; 16.11.2013
comment
@Brandan, спасибо! работает и помогает высушить мои характеристики! - person mugwump; 16.11.2013

Я думаю, вам нужно явно сообщить RSpec, что вы используете маршрут Rails с пространством имен. НАПРИМЕР,

# :use_route => ENGINE_NAMESPACE
:use_route => 'licensing'

Кроме того, почему бы не упростить написание тестов контроллера RSpec следующим образом:

describe Licensing::LicensesController do
  it 'GET index' do
    get :index, use_route: 'licensing'
  end
end

Вот ссылка на контроллеры RSpec, которые я сделал, https://github.com/westonplatter/questionnaire_engine/tree/engine/spec/controllers

person westonplatter    schedule 11.08.2012
comment
Спасибо за ваш ответ, но мой вопрос касается именно тестов маршрутизации, т.е. я хочу явно проверить, что /licensing/licenses направляет к правильному контроллеру и действию, а не только то, что я могу get :index на данном контроллере. Думаю, я нашел решение, хотя оно не очень хорошее. - person Brandan; 11.08.2012