10.2 モデル・コントローラ・ビューのテスト

モデルのバリデーションのテスト

現在Userモデルは以下のように定義されています。emailカラムはpresence: trueのバリデーションが定義されています。

app/models/user.rb

class User < ApplicationRecord
  has_many :posts

  validates :email, presence: true
end

Rspecでテストをするにはまずモデルのテストファイルを作成します。以下のようなファイルを作成します。

spec/models/users_spec.rb

require 'rails_helper'

RSpec.describe User, type: :model do
  before do
    @user = build(:user)
  end

  describe 'バリデーション' do
    it 'emailが空場合は不正な値である' do
      @user.email = nil
      expect(@user.valid?).to eq(false)
    end
  end
end

上の例のbeforeブロックではテストで使うUserのインスタンスを作成しています。beforeはテストケースが実行される前に実行されます。

describeブロックに引数にはテストの対象について書きます。今回であればバリデーションになります。 itブロックにはテストの期待する動作を記述します。今回であればemailが空場合は不正な値であるということです。

itブロックの中では実際に@useremailnilを代入して、今回テストする状態にしています。

expectメソッドはテスト対象を検証するためのメソッドで、expect(実行した結果).to eq 期待する結果という感じで記述します。

eqmatcher(マッチャー)と言います。今回の場合であれば、「@user.valid?falseと等しい」と文章で表すことができます。

テストケースを実行するにはrspecコマンドを利用します。

$ rspec spec/models/users_spec.rb
.

Finished in 0.01517 seconds (files took 2.26 seconds to load)
1 example, 0 failures

上のように出力されていればテストにパスしました。

モデルのメソッドのテスト

以下のようなemailを大文字で返すuppercase_emailメソッド定義しました。このメソッドをテストしていきたいと思います

app/models/user.rb

class User < ApplicationRecord

  def uppercase_email
    self.email.upcase
  end
end

以下のようにspec/models/users_spec.rbに書きなおします。

spec/models/users_spec.rb

require 'rails_helper'

RSpec.describe User, type: :model do
  before do
    @user = create(:user)
  end

  describe 'メソッド' do
    it 'emailが大文字で返ってくること' do
      expect(@user.uppercase_email).to eq(@user.email.upcase)
    end
  end
end

今回のテストでは@user.uppercase_emailで返されるemail@user.email.upcaseで返却されるemailが等しいことが確認されればパスされます。

Webリクエストが成功したかテストする

spec/controllers/posts_controller_spec.rb

require 'rails_helper'

RSpec.describe PostsController, type: :controller do
  before do
    @post = create(:post)
    get :show, id: @post.id
  end

  describe 'GET #show' do
    it 'ステータスが200が返却される' do
      expect(response).to have_http_status(:ok)
    end
  end
end

正しいオブジェクトが取得されたかテストする

spec/controllers/posts_controller_spec.rb

require 'rails_helper'

RSpec.describe PostsController, type: :controller do
  before do
    @post = create(:post)
    get :show, id: @post.id
  end

  describe 'GET #show' do
    it '正しいオブジェクトが取得される' do
      expect(assigns(:post)).to eq(post)
    end
  end
end

正しいビューが表示されたかテストする

spec/controllers/posts_controller_spec.rb

require 'rails_helper'

RSpec.describe PostsController, type: :controller do
  before do
    @post = create(:post)
    get :show, id: @post.id
  end

  describe 'GET #show' do
    it '正しいビューが表示される' do
      expect(response).to render_template :show
    end
  end
end

正しいページにリダイレクトされたかテストする

spec/controllers/posts_controller_spec.rb

require 'rails_helper'

RSpec.describe PostsController, type: :controller do
  before do
    post :posts, params: {
      'post': {
        title: 'タイトルです',
        body: '本文です'
      }
    }
  end

  describe 'POST #create' do
    it 'Postページにリダイレクトされる' do
      post = assigns(:post)
      expect(response).to redirect_to post_path(id: post.id)
    end
  end
end

results matching ""

    No results matching ""