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内でルーティングを認識させる必要があります。
spec_helper.rb
...
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を行う設定にします。
engine.rb
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のやり方を参考にしています。