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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

1回答

3575閲覧

validationエラーが発生したときのexception検知について

GOROGORO

総合スコア66

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/05/04 10:45

編集2015/05/05 09:26

こんにちは。

Rails4でRspec3を使ってspecを作成しています。
modelでvalidationエラーが発生したときにcontrollerでexceptionをキャッチすることは可能でしょうか?
rspsecでcontrollerのテストを書いているのですが、specが通らず。。。
controllerが悪いのか、modelが悪いのか、specが悪いのかよく分かっていません。。。
以下にそれぞれ記載します。
お教えいただけると大変助かります。
よろしくお願いします!!

controller createメソッド

lang

1class BlogTextsController < ApplicationController 2 def create(blog_texts , index_id) 3 begin 4 logger.debug("#{Time.now} blog_texts_controler create start!!") 5 #ハッシュを配列に変換する 6 @text_array=blog_texts.values 7 @blog_texts=[] 8 logger.debug("textの個数は#{@text_array.size}です") 9 logger.debug("textの個数は#{index_id}です") 10 #blog_textesのnew呼び出す。 11 for text_id in 0..@text_array.size - 1 do 12 BlogText.create(:index_id=>index_id,:text_id=>text_id ,:text=>@text_array[text_id]) 13 logger.debug("#{@text_array.size}個中 #{text_id + 1}個目を登録しました。") 14 end 15 rescue => e 16 p e 17 ensure 18 logger.debug("#{Time.now} blog_texts_controler create end!!") 19 end 20 end 21end 22

model textがnullであればvalidationエラー

lang

1class BlogText < ActiveRecord::Base 2 #blog_iindexと多対1の関係 3 belongs_to :blog_index 4 #valudate textは必須 5 validates :text, presence: true 6 def self.find_by_index_id(index_id) 7 blog_images=BlogText.select(:text_id,:text).where(index_id: index_id) 8 end 9 10 def self.fild_by_detail(id) 11 blog_texts=BlogText.where(id: id) 12 end 13 14end

spec エラーパターンのテスト箇所

lang

1RSpec.describe BlogTextsController, :type => :controller do 2 describe "POST #create" do 3 #無効な属性の場合 4 context "with invalid attributes" do 5 # データベースに新しいタスクを保存すること 6 it "returns an error " do 7 blog_texts_controller=BlogTextsController.new 8 expect{ 9 text_array_size=blog_texts_controller.create(@invalid_params,@blog_index.id) 10 }.to raise_error ("message") 11 end 12 end 13 end 14end

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

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

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

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

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

guest

回答1

0

この書き方だと、Controller側で例外をキャッチしてしまっているため、外側のRSpecから見れば例外は見えず、バリデーションには失敗します。

また、モデル側についても、create!のように!ありのメソッドを呼ばない限り、バリデーション失敗は例外とはなりません。

投稿2015/05/07 02:54

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問