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

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

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

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

Q&A

1回答

8422閲覧

RSpecのテストにerrorがあるかを確認する方法

ayu

総合スコア212

RSpec

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

0グッド

0クリップ

投稿2015/12/10 04:38

編集2015/12/10 04:54

こんにちは。

昔のRSpecの記事を見ていて、それを今風に変えようとチャレンジしていますが、うまくいかないので相談させていただきます。

参考URL:[http://magazine.rubyist.net/?0021-Rspec#l58]

テスト内容

  • ブログ投稿のnameにvalidationで、投稿時に必須にする
  • 入力されていない場合はnameにエラーを持つ

・前提条件

app/models/blog.rb class Blog < ActiveRecord::Base validates :name, presence: true end
spec/fixtures/blogs.yml one: id: 1 name: 今日の出来事その1 two: id: 2 name: 今日の出来事その2
db/migrate/XX_create_blogs.rb class CreateBlogs < ActiveRecord::Migration def change create_table :blogs do |t| t.string :name, null: false t.timestamps null: false end end end
spec/models/blog_spec.rb require 'rails_helper' RSpec.describe Blog, type: :model do pending "add some examples to (or delete) #{__FILE__}" end describe Blog, 'when not set #name' do before(:each) do @blog = Blog.new end it 'expect be valid' do expect(@blog).not_to be_valid end #これがエラーになります it 'name have error' do expect(@blog.errors[:name]).to be_present end end
エラーメッセージ Failures: 1) Blog when not set #name name have error Failure/Error: expect(@blog.errors[:name]).to be_present expected `[].present?` to return true, got false # ./spec/models/blog_spec.rb:17:in `block (2 levels) in <top (required)>' Finished in 0.03023 seconds (files took 1.72 seconds to load) 3 examples, 1 failure, 1 pending

なぜ、エラーメッセージがないのかがわからないです。

下が参考にしていたホームページの書き方ですが、haveが使えなくなっているようなので、書き方を変更しております。

it ":name にエラーが設定されていること" do @blog.should have(1).errors_on(:name) end

お手数をおかけしますが、何卒宜しくお願いします>_<

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

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

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

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

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

guest

回答1

0

バリデーション(と、エラーメッセージの記録)はモデルのvalid?メソッドが呼び出された際に実行されます。

it 'expect be valid' do expect(@blog).not_to be_valid end

こちらでは be_valid によって @blog の valid? メソッドが呼び出されるのでバリデーションが行われ期待通りの結果になりますが、

#これがエラーになります it 'name have error' do expect(@blog.errors[:name]).to be_present end

こちらでは valid? メソッドが実行されてていないため、バリーデションがおこなわれておらず、エラーメッセージも記録されていない状態で @blog.errors[:name] が present? である事を試しているため期待通りの結果が得られない事になります。

ちなみに古い書き方の

it ":name にエラーが設定されていること" do @blog.should have(1).errors_on(:name) end

では errors_on で valid? が呼ばれるため期待通りの結果になります。

投稿2016/10/09 13:34

hana-da

総合スコア1728

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問