LoginSignup
12
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-03-26

はじめに

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'
12
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8