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

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

ただいまの
回答率

87.36%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,936

score 212

こんにちは。

昔の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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 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? が呼ばれるため期待通りの結果になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る