質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1295閲覧

RSpecのテストでNo route matchesが出る

syozaburo

総合スコア0

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2021/12/08 03:39

前提・実現したいこと

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.*

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問