Edited at

Rspec3.8.0以降のGetリクエストはrender_viewsが必須にっている件


はじめに

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

単純にcontrollerGetリクエストをしたときの挙動です。


controller_spec.rb

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リクエストは普通に通りました。


controller_spec.rb

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を設定しましょう


spec/rails_helper.rb

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'