LoginSignup
0
0

【RSpec】POSTリクエストが送れずハマった話

Posted at

はじめに

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モデルを使用した方が良さそうですね。
改めて命名法には気をつけなければならないと痛感しました。

参考文献

0
0
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
0
0