0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rspecのrequest specにて値の削除や更新、作成などのテストをする際の注意点

Posted at

概要

Rspecのテストで、値を更新や削除などのデータ変更が加えられた際に
テストの記述の仕方について多少手間取ったので備忘録としてアウトプットします。

環境

Ruby '3.0.1'
rails '6.1.4'
rspec-rails '5.0.2'

テストコード

前提

今回のテストはpostコントローラーにdeleteリクエストを送った際に、
該当する投稿データが削除されるといったテストを想定します。
なお、実際のコードについては説明に重点を置くため簡易的に表記します。

controllers/posts_controller.rb

class PostsController < ApplicationController
  def destroy
    post = Post.find(params[:id]) # 左記のコードでは誰の投稿でも削除が可能になってしますので、
    post.destory                  # ユーザー自身の投稿のみ削除可能にするための条件分岐等を行ったほうが良い
  end
end

spec/requests/posts_spec.rb (失敗例)

RSpec.describe "Posts", type: :request do
  describe 'DELETE /destroy' do
    # 以降はFactory_Botで設定済みと仮定
    # UserモデルとPostモデルの関連付けも設定済みと仮定

    let!(:user) { create(:user) } # テストユーザーを生成
    let(:post_params) { { content: 'example_content' } }
    let!(:post) { user.posts.create(post_params) } # userの投稿データを作成

    before do
      delete posts_path(post) # 投稿データを削除するリクエストを送る
    end

    it 'userの投稿が削除される' do
      expect(user.posts).not_to include post #左記のように記載すると失敗する
    end
  end
end

spec/requests/posts_spec.rb (成功例)

RSpec.describe "Posts", type: :request do
  describe 'DELETE /destroy' do
    # 以降はFactory_Botで設定済みと仮定
    # UserモデルとPostモデルの関連付けも設定済みと仮定

    let!(:user) { create(:user) } # テストユーザーを生成
    let(:post_params) { { content: 'example_content' } }
    let!(:post) { user.posts.create(post_params) } # userの投稿データを作成

    before do
      delete posts_path(post) # 投稿データを削除するリクエストを送る
    end

    it 'userの投稿が削除される' do
      expect(user.posts.reload).not_to include post #修正
    end
  end
end

失敗の原因

失敗例で記載したexpect内のuser.postsは最初のlet!に定義したユーザーのデータが格納されてしまっているので
__deleteリクエストを送る前のデータ__を参照していることになります。
したがって成功例で示したようにuser.posts.reloadとすることによって
user.postsの__データを更新__してあげなければならなかったようです。

備考

  • モデル同士の関連付けについて確認したい場合 →
    Railsガイド
  • Factory_Botについて確認したい場合 →
    github
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?