Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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'
ngron
目がしんどい
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away