##はじめに
Controller specs
に関する記事です。
共通化を行うために変数定義を行った際、命名を適当に行ったら沼ったので備忘録として残しておくことにします!
##環境
ruby 2.6.5
rails 5.2.4.2
rspec 3.7
capybara 2.15
factory_bot_rails 4.11
##エラー内容
####エラー修正前のコード
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変数の命名を変えてあげます。
##解決策
####コード修正後
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
通りました!
今回のエラーで、変数の命名には気をつけようと改めて感じさせられました…笑