前提・実現したいこと
rspecのテストを通したい
発生している問題・エラーメッセージ
エラーメッセージ ActionController::UrlGenerationError: No route matches {:action=>"update", :controller=>"admin/movies", :movie=>{:id=>617, :image_url=>"https://techbowl.co.jp/_nuxt/img/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111lllllllllllll.png"}}
該当のソースコード
rails
1Rails.application.routes.draw do 2 get '/movies', to: 'movies#index' 3 namespace :admin do 4 resources :movies 5 end 6end
rails
1class Admin::MoviesController < ApplicationController 2 before_action :set_movie, only: [:edit, :update] 3 4 def index 5 @movie = Movie.all 6 end 7 8 def new 9 @movie = Movie.new 10 end 11 12 def create 13 @movie = Movie.new(movie_params) 14 if @movie.save 15 redirect_to admin_movies_path, status: 302 16 else 17 flash.now[:alert] = "全て入力してください" 18 render :new 19 end 20 end 21 22 def edit 23 end 24 25 def update 26 if !@movie.present? 27 flash.now[:danger] = "編集元の映画は存在しません" 28 render :index 29 end 30 if @movie.update(movie_params) 31 redirect_to admin_movies_path, notice: "編集しました" 32 else 33 flash.now[:danger] = "編集に失敗しました" 34 render :edit 35 end 36 end 37 38 private 39 40 def movie_params 41 params.require(:movie).permit( :name, :year, :is_showing, :description, :image_url) 42 end 43 44 def set_movie 45 @movie = Movie.find(params[:id]) 46 end 47end
rails
1RSpec.describe Admin::MoviesController, type: :controller do 2 render_views 3 describe 'Station4 GET /admin/movies/:id/edit' do 4 let!(:movie) { create(:movie) } 5 before { get 'edit', params: {id: movie.id} } 6 7 it '200を返すこと' do 8 expect(response).to have_http_status(200) 9 end 10 11 it 'HTMLを返すこと' do 12 expect(response.body).to include('<!DOCTYPE html>') 13 end 14 15 it 'HTMLの中にはformタグがあること' do 16 expect(response.body).to include('</form>') 17 end 18 19 it 'フォーム内に予め movies(:id) のレコードに対応する値が入っていること' do 20 expect(response.body).to include(movie.name) 21 end 22 end 23 24 describe 'Station4 PUT /admin/movies/:id' do 25 let!(:movie) { create(:movie) } 26 let!(:movie_attributes) { { name: "TEST" } } 27 28 it '302を返すこと' do 29 post :update, params: { id: movie.id, movie: movie_attributes }, session: {} 30 expect(response).to have_http_status(302) 31 end 32 33 it 'エラー処理がされていて仮にRailsデフォルトのエラー画面が出ないこと' do 34 # 今回はデータベースエラーで例外処理 35 post :update, params: { movie: { id: movie.id, image_url: "https://techbowl.co.jp/_nuxt/img/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111lllllllllllll.png" } }, session: {} 36 expect(response).to have_http_status(:ok) 37 end 38 end 39end
試したこと
ログを確認してAdmin::MoviesController#updateが読み込まれていることを確認し、実際に更新もできています。
補足情報(FW/ツールのバージョンなど)
Rails 6.*
Ruby 2.7
MySQL 8.*
Node.js 14.*
Yarn 1.22.*
Docker 20.10.*
Docker Compose 1.29.*
あなたの回答
tips
プレビュー