はじめに
rails6にアップグレードして早速Controllerでrspecを走らせていたのですが謎のエラーが発生し、いくら検索してもひっかからなかったため同じエラーが出てきた方のために残しておきます。
5時間くらい一人でハマってましたが、最終的に師匠に助けていただきました。
実行環境
Rails 6.0.0.beta3: https://github.com/rails/rails/releases/tag/v6.0.0.beta1
Rspec 3.8.0: https://github.com/rspec/rspec/releases
謎のActionView::Template::Error
単純にcontroller
でGet
リクエストをしたときの挙動です。
equire 'rails_helper'
RSpec.describe AdminsController, type: :controller do
describe "#index" do
it "test" do
get :index
expect(response).to render_template :index
end
end
end
これでspecを実行すると。。
ActionView::Template::Error:
wrong number of arguments (given 2, expected 1)
# /usr/local/bundle/gems/meta-tags-2.11.1/lib/meta_tags/controller_helper.rb:22:in `render'
# /usr/local/bundle/gems/rails-controller-testing-1.0.4/lib/rails/controller/testing/template_assertions.rb:61:in `process'
# /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:35:in `block in process'
# /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:102:in `catch'
# /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:102:in `_catch_warden'
# /usr/local/bundle/gems/devise-4.6.1/lib/devise/test/controller_helpers.rb:35:in `process'
# /usr/local/bundle/gems/rails-controller-testing-1.0.4/lib/rails/controller/testing/integration.rb:13:in `block (2 levels) in <module:Integration>'
# ./spec/controllers/admins/accounts_controller_spec.rb:19:in `block (3 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# ArgumentError:
# wrong number of arguments (given 2, expected 1)
# /usr/local/bundle/gems/meta-tags-2.11.1/lib/meta_tags/controller_helper.rb:22:in `render'
!!!!
ArgumentError?引数が多い?一つしか渡してないはずなのになぜだろう。。
この後matcher
を変えても同じエラーがでてしまい、どうやらget :index
の行でエラーが出てるっぽい。
エラー文をよく見てみるとmeta_tags
というGemのrender
でひっかかってるみたいなのでコードを読みに行きました。
https://github.com/kpumuk/meta-tags/blob/master/lib/meta_tags/controller_helper.rb#L22
が、superばっかでなんて書いてあるのか正直よくわからず。。
ちなみにpostリクエストは普通に通りました。
describe "#create" do
let(:admin) { create(:admin) }
it "create_admin" do
post :create, params: { admin: attributes_for(:admin) }
expect { subject }.to change { Admin.count }.by(1)
end
end
meta-tagのversionが関連してる?とか思いつつもそれっぽい記事がヒットしません。
なぜGETだけ通らないんだろうと困ってた矢先、師匠に助けていただきました。
解決策
render_view
を設定しましょう
RSpec.configure do |config|
config.render_views
end
1 examples, 0 failures
なぜかこれで通るようになりました。
直接controller
に書いてもいいですが、今後同じエラーが出ないようにrails_helper
に記述しておくのが親切かと。
今までrender_views
って必須じゃなかった気がしますが。。^^;
render_view: https://relishapp.com/rspec/rspec-rails/docs/controller-specs/render-views
おわりに
Rails6
による影響かな?とは思いつつも、現在の最新版ではrender_view
が必須とも書いてないですし、今のところ原因はよくわかっておりません。
もしわかる方がいたら指摘いただけると大変嬉しいです(m_ _m)
追記
Rspec4.0
以上を使えば無事解決します。
指摘してくださった@takeyuwebさんありがとうございました!
gem 'rspec-rails', '~> 4.0.0.beta2'