8

通常の方法でRailsエンジンを作成し、RSpecをインストールして、モデルのスキャフォールドを生成しましたが、ルーティング仕様を渡すことができません。

これが1つの例です:

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の間に多少の食い違いがあり、それが何であるかわかりません。この問題を解決すると主張する記事をいくつか見つけましたが、どれも役に立ちませんでした。それらのいくつかはRails3.1に固有のものです。

Rails 3.2 / RSpec 2.10でこの問題を解決した人はいますか?

4

2 に答える 2

10

更新 (2013-10-31)

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 が特定のパスにエンジンをマウントできるかどうかはテストしていません。エンジンが独自のルートを正しく設定していることのみをテストしています。それでも、それを実現するためにインスタンス変数を上書きする必要はありません。

このトピックに関する別の良いスレッドをいくつか示します。

于 2012-08-11T15:03:39.190 に答える
7

名前空間付きの Rails ルートを使用していることを RSpec に明示的に通知する必要があると思います。例えば、

# :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

于 2012-08-11T03:10:57.627 に答える