タスク管理アプリを作成しており、userモデルとtaskモデルを作成しています。
RSpecで、Controller-specを書いています。
pachリクエストを送るspecの部分で、エラーが出ます。
エラーは以下の通りです。
Failure/Error: task = current_user.tasks.find(params[:id]) ActiveRecord::RecordNotFound: Couldn't find Task with 'id'=1 [WHERE "tasks"."user_id" = ?] # ./app/controllers/tasks_controller.rb:30:in `update' # ./spec/controllers/tasks_controller_spec.rb:107:in `block (4 levels) in <top (required)>' # -e:1:in `<main>'
task_controller_spec.rbファイルは以下です。
user_id= ?となっていますが、以下の@task= ...のFactoryBot部分のように、userモデルとtaskモデルは関連させています。
エラーの内容から、関連が上手くいっていないのかなと思っていますが、どのようにすれば解決できるでしょうか。
よろしくお願いいたします。
rb:spec.task_controller_spec.rb
1require 'rails_helper' 2include SessionsHelper 3 4RSpec.describe TasksController, type: :controller do 5 6 describe "PATCH #update" do 7 8 context "認可されていないユーザーとして" do 9 before do 10 @user_a = FactoryBot.create(:user) 11 @user_b = FactoryBot.create(:user) 12 @task = FactoryBot.create(:task, user: @user_b, name: "タスク") 13 end 14 15 it "タスクが更新できない" do 16 task_params = FactoryBot.attributes_for(:task, name: "新しいタスク") 17 log_in @user_a 18 patch :update, params: { id: @task.id, task: task_params} 19 expect(@task.reload.name).to eq "タスク" 20 end 21 22 end 23 end 24 end 25
controller.rbは以下です。
class TasksController < ApplicationController before_action :login_required def index @tasks = current_user.tasks.order(created_at: :desc) end def show @task = current_user.tasks.find(params[:id]) end def new @task = Task.new end def create @task = current_user.tasks.new(task_params) if @task.save redirect_to @task, notice: "タスク #{@task.name} を登録しました" else render :new end end def edit @task = current_user.tasks.find(params[:id]) end def update task = current_user.tasks.find(params[:id]) task.update!(task_params) redirect_to tasks_url, notice: "タスク #{task.name} を更新しました" end def destroy task = current_user.tasks.find(params[:id]) task.destroy redirect_to tasks_url, notice: "タスク #{task.name} を削除しました" end private def task_params params.require(:task).permit(:name, :description) end def login_required redirect_to login_path unless current_user end end
FactoryBotのtaskは以下です。
FactoryBot.define do factory :task do sequence(:name) {|n| "タスク#{n}"} description { "RSpec & Capybara & FactoryBotを準備する"} association :user end end
FactoryBotのuserは以下です。
FactoryBot.define do factory :user, aliases: [:owner] do name { "テストユーザー"} sequence(:email) {|n| "test#{n}@example.com"} password { "password"} end end
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/28 23:29