前提・実現したいこと
「Everyday Rails-RspecによるRailsテスト入門」を進めています。
第7章「リクエストスペックで API をテストする」の部分で質問です。
本書の通り、コントローラースペックをリクエストスペックで書き換える作業を行っているのですが、本書のtasksのテストをどのようにリクエストスペックで書き換えれば良いのかが分かりません。
発生している問題・エラーメッセージ
Failures: 1) Tasks #create responds with JSON formatted output Failure/Error: params.require(:project).permit(:name, :description, :due_on) ActionController::ParameterMissing: param is missing or the value is empty: project
該当のソースコード
spec/request/tasks_request_spec.rb
1require 'rails_helper' 2 3RSpec.describe "Tasks", type: :request do 4 let(:headers) do 5 { 'Accept' => 'application/json' } 6 end 7 before do 8 @user = FactoryBot.create(:user) 9 @project = FactoryBot.create(:project, owner: @user) 10 @task = @project.tasks.create!(name: "Test task") 11 end 12 13 describe "#show" do 14 #JSON形式でレスポンスを返すこと 15 it "responds with JSON formatted output" do 16 sign_in @user 17 get projects_url, headers: headers, params: { project_id: @project.id, id: @task.id } 18 expect(response.content_type).to eq "application/json" 19 end 20 end 21 describe "#create" do 22 #JSON形式でレスポンスを返すこと 23 it "responds with JSON formatted output" do 24 new_task = { name: "New test task" } 25 sign_in @user 26 post projects_url, headers: headers, params: { project_id: @project.id, task: new_task } 27 expect(response.content_type).to eq "application/json" 28 end 29 end 30end
controllerで書かれた書き換える前のテスト
RSpec.describe TasksController, type: :controller do before do @user = FactoryBot.create(:user) @project = FactoryBot.create(:project, owner: @user) @task = @project.tasks.create!(name: "Test task") end describe "#show" do # JSON 形式でレスポンスを返すこと it "responds with JSON formatted output" do sign_in @user get :show, format: :json, params: { project_id: @project.id, id: @task.id } expect(response.content_type).to eq "application/json" end describe "#create" do # JSON 形式でレスポンスを返すこと it "responds with JSON formatted output" do new_task = { name: "New test task" } sign_in @user post :create, format: :json, params: { project_id: @project.id, task: new_task } expect(response.content_type).to eq "application/json" end end
試したこと
Rspecのテストの書き方というよりかはRailsのパスの指定方法がよくわからないという問題だと思っています。
以下はサンプルアプリケーションでrake routes
で出力されるPathです。
project_tasks GET /projects/:project_id/tasks(.:format) tasks#index POST /projects/:project_id/tasks(.:format) tasks#create new_project_task GET /projects/:project_id/tasks/new(.:format) tasks#new edit_project_task GET /projects/:project_id/tasks/:id/edit(.:format) tasks#edit project_task GET /projects/:project_id/tasks/:id(.:format) tasks#show
上記の通り、projectsのパス上にtaskを追加する構成になっています。
これをどのようにRspec上でparamsで設定すれば良いのかが分かりません。
以下が生成したファクトリーです
#facrories/projects.rb FactoryBot.define do factory :project do sequence(:name) { |n| "Test Project #{n}" } description { "A test project." } due_on { 1.week.from_now } association :owner #メモ付きのプロジェクト trait :with_notes do after(:create) { |project| create_list(:note, 5, project: project) } end #昨日が締め切りのプロジェクト trait :due_yesterday do due_on { 1.day.ago } end #今日が締め切りのプロジェクト trait :due_today do due_on { Date.current.in_time_zone } end #明日が締め切りのプロジェクト trait :due_tomorrow do due_on { 1.day.from_now } end #無効になっている trait :invalid do name { nil } end end end
#facrories/users.rb FactoryBot.define do factory :user, aliases: [:owner] do first_name { "Aaron" } last_name { "Aaron" } sequence(:email) { |n| "tester#{n}@example.com" } password { "dottle-nouveau-pavilion-tights-furze" } end end
補足情報(FW/ツールのバージョンなど)
rails 6.0.3.5
rspec-support 3.10.2
rspec-core 3.10.1
rspec-expectations 3.10.1
rspec-mocks 3.10.2
rspec-rails 4.0.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/27 06:24
2021/02/27 06:26
2021/02/27 07:26
2021/02/27 07:28
2021/02/27 07:39
2021/02/27 09:04
2021/02/27 09:23