Rails EngineにCapybaraを導入しようとしてハマったことが二つあるので、備忘録として残しておきたいと思います。
ルーティングを認識させる
Railsアプリを普通に書いている場合は気にする必要がないのですが、Rails Engineでfeature specをいきなり動かそうとすると、visit (path)
のところで以下のようなエラーが発生します。
1) method_call_situation pages (permit WebUI) render Succsess Failure/Error: visit method_call_situations_path NameError: undefined local variable or method `method_call_situations_path' for #<RSpec::ExampleGroups::MethodCallSituationPages::PermitWebUI:0x007fe1d21b1730> # ./spec/features/method_call_situations_page_spec.rb:34:in `block (2 levels) in <top (required)>'
Rails Engineではspec内でルーティングを認識させる必要があります。
... RSpec.configure do |config| config.include OkuribitoRails::Engine.routes.url_helpers end ...
これで、名前付きルートが認識されるようになります。
asset precompile を行うようにする
feature spec内でRails Engine内で持っている画像等のAssetを参照しようとすると、以下のようなエラーが発生します。
1) method_call_situation pages (permit WebUI) available search function Failure/Error: <%= image_tag "okuribito_rails/logo.png", class: "header-logo" %> ActionView::Template::Error: Asset was not declared to be precompiled in production. Add `Rails.application.config.assets.precompile += %w( okuribito_rails/logo.png )` to `config/initializers/assets.rb` and restart your server # ./app/views/layouts/okuribito_rails/_header.html.erb:2:in `___sers_ym_works_okuribito_rails_dev_app_views_layouts_okuribito_rails__header_html_erb__3728936773133030127_70218317871640' # ./app/views/layouts/okuribito_rails/application.html.erb:11:in `___sers_ym_works_okuribito_rails_dev_app_views_layouts_okuribito_rails_application_html_erb___1363027026573178022_70218307163340' # ./spec/features/method_call_situations_page_spec.rb:34:in `block (2 levels) in <top (required)>' # ------------------ # --- Caused by: --- # Sprockets::Rails::Helper::AssetNotPrecompiled: # Asset was not declared to be precompiled in production. # Add `Rails.application.config.assets.precompile += %w( okuribito_rails/logo.png )` to `config/initializers/assets.rb` and restart your server # ./app/views/layouts/okuribito_rails/_header.html.erb:2:in `___sers_ym_works_okuribito_rails_dev_app_views_layouts_okuribito_rails__header_html_erb__3728936773133030127_70218317871640'
Rails Engine単体では、asset precompileを行うように書かれていないハズなので、当たり前っちゃ当たり前です。
そこで、以下のようにengine.rb
にて、asset precompileを行う設定にします。
module OkuribitoRails class Engine < ::Rails::Engine isolate_namespace OkuribitoRails initializer "okuribito_rails.assets.precompile", group: :all do |app| app.config.assets.precompile += %w( okuribito_rails/logo.png ) end end end
これで、テストが通るようになります。
なお、この対処方法が正しいかどうかは残念ながら保証しかねますが、rails_adminというgemのやり方を参考にしています。