LoginSignup
5
4

More than 3 years have passed since last update.

【RSpec】ArgumentError: wrong number of argumentsエラーが出たら、変数の命名を気にした方がいいかもしれないのですね

Posted at

はじめに

Controller specsに関する記事です。
共通化を行うために変数定義を行った際、命名を適当に行ったら沼ったので備忘録として残しておくことにします!

環境

ruby 2.6.5
rails 5.2.4.2
rspec 3.7
capybara 2.15
factory_bot_rails 4.11

エラー内容

エラー修正前のコード

spec/controllers/posts_controller_spec.rb
require 'rails_helper'

RSpec.describe PostsController, type: :controller do

  context "ログインを必要としないアクション" do
  .
  .
  .
  end

  context "ログインを必要とするアクション" do

    let(:user) { FactoryBot.create(:user) }
    let(:login_user) { login(user) }
    let(:post) { FactoryBot.create(:post) }
    let(:post_params) { FactoryBot.attributes_for(:post) }

    describe "createアクション" do

      context "ログイン済みユーザーの場合" do
        it "投稿を作成する" do
          login user
          expect {
            post :create, params: { post: post_params }
          }.to change(user.posts, :count).by(1)
        end
      end

      context "ログインしていないユーザーの場合" do
      .
      .
      .
      end

    end
  end
end

 前提
  ➡︎テスト用データ作成のためにFactoryBotを使用してます。(postは関連付け済み)
  ➡︎ログイン用にrails_helper.rbファイルに、login(user)メソッドを定義してます。

エラー内容

Failures:
  1) PostsController ログインを必要とするアクション createアクション ログイン済みユーザーの場合 投稿を作成する
    Failure/Error: post :create, { post: post_params }

    ArgumentError:
      wrong number of arguments (given 2, expected 0)
   # ./spec/controllers/posts_controller_spec.rb:85:in `block (5 levels) in <main>'

呼び出し側(give)の引数の数が2、メソッド側(expected)の引数の数が0となっています。

つまり「引数が2つ呼び出されているのに、それに当たるメソッド側の引数が存在しない」ということで怒られています。

エラー地点

post :create, params: { post: post_params }

何故この記述がエラーになるかというと、私が勝手にパラメータのキーとして渡しているつもりになっていた上記の「post:」部分が、実はキーとしてではなく投稿の共通化をするために定義したpost変数だと見なされていたことが原因でした。

2つのgivenは「post:」と「post_params」のことを指していたんですね…。

なので、「post:」部分をキーとして認識してもらえるように共通化の方のpost変数の命名を変えてあげます。

解決策

コード修正後

spec/controllers/posts_controller_spec.rb
require 'rails_helper'

RSpec.describe PostsController, type: :controller do

  context "ログインを必要とするアクション" do

    let(:user) { FactoryBot.create(:user) }
    let(:login_user) { login(user) }
    - let(:post) { FactoryBot.create(:post) } #削除
    + let(:new_post) { FactoryBot.create(:post) } #変数名変更
    let(:post_params) { FactoryBot.attributes_for(:post) }

    describe "createアクション" do
      context "ログイン済みユーザーの場合" do
        it "投稿を作成する" do
          login user
          expect {
            post :create, params: { post: post_params }
          }.to change(user.posts, :count).by(1)
        end
      end
    end
  end
end

post変数をnew_post変数へ書き換え。

spec実行

$ bin/rspec spec/controllers

1 examples, 0 failures

通りました!

今回のエラーで、変数の命名には気をつけようと改めて感じさせられました…笑

参考

 https://qiita.com/yikegaya/items/98f0c12f5c25ee4731a1

5
4
0

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
5
4