はじめに
request specに関する記事です。
かなり沼った+参考になる記事があまり無かったので、初学者に役に立てれば嬉しいです!
RubyとRailsのバージョン
- Ruby 2.7.7
- Rails 6.0.6.1
エラー発生時点
修正前コード
※FactoryBotにてuserとpostを登録しています。
spec/requests/likes_spec.rb
require 'rails_helper'
RSpec.describe 'Api::Likes', type: :request do
let!(:user) { create(:user) }
let!(:post) { create(:post, user: user) }
context 'ログインしている場合' do
before do
sign_in user
end
describe 'POST /api/like' do
it 'いいね出来る' do
post post_like_path(post.id)
body = JSON.parse(response.body)
expect(response.status).to eq(200)
expect(body).to eq({ 'likesCount'=>1, 'status'=>'ok' })
end
end
end
end
エラー内容
Failures:
1) Api::Likes ログインしている場合 POST /api/like いいね出来る
Failure/Error: post post_like_path(post.id)
ArgumentError:
wrong number of arguments (given 1, expected 0)
# ./spec/requests/api/likes_spec.rb:24:in `block (4 levels) in <top (required)>'
エラー文には「予測される引数は0個だけど、1個余分にあるよ」って事が書いてあります。
ヘルパーメソッドのpost_like_pathに、(post.id)という引数が1つ必要なのに??
原因
エラー内容をググってみると、同じような内容の方を1名発見しました。
post post_like_path(post.id)
ここでPOSTリクエストを送っていたつもりが、Rspecでは
let!(:post) { create(:post, user: user) }
で定義していたpost変数の事だと認識していたようです。
エラー改善
修正後コード
spec/requests/likes_spec.rb
require 'rails_helper'
RSpec.describe 'Api::Likes', type: :request do
let!(:user) { create(:user) }
# 下記post→new_postと定義
# postリクエストとpostインスタンスが重複してしまう為
let!(:new_post) { create(:post, user: user) }
context 'ログインしている場合' do
before do
sign_in user
end
describe 'POST /api/like' do
it 'いいね出来る' do
post post_like_path(new_post.id)
body = JSON.parse(response.body)
expect(response.status).to eq(200)
expect(body).to eq({ 'likesCount'=>new_post.likes.count, 'status'=>'ok' })
end
end
end
end
無事テストが通りました。
最後に
Postモデルではなく、Articleモデルを使用した方が良さそうですね。
改めて命名法には気をつけなければならないと痛感しました。
参考文献