フォームオブジェクトのテストをRSpecで書く

フォームオブジェクト(Form Object)の説明は以下参照。

app/forms/password_form.rb がテストしたいフォームオブジェクトとする。

# -*- coding: utf-8 -*-
class PasswordForm

  include ActiveModel::Model

  ## 属性の定義 ##
  attr_accessor :password
  
  # バリデーション
  validates :password, length: {maximum: 10}

  ## 保存しないので常にfalse
  def persisted?
    return false
  end

  ## 保存しないので何もしない
  def save
    return true
  end
end

rspec-rails 3.0.1 以上の場合、spec/forms/password_form_spec.rb というファイルを作り中身を以下のようにする。

# -*- coding: utf-8 -*-
require 'rails_helper'

RSpec.describe PasswordForm, :type => :model do

  before :each do
      @password_form = PasswordForm.new
  end

  describe "バリデーションのチェック" do

    it "パスワードが10文字より多い場合は異常である" do
      @password_form.password = "a" * 11
      @password_form.valid?
      expect(@password_form.errors[:password]).to be_present
    end 

  end
  
  describe "メソッドのチェック" do
    it "#persisted?が常にfalse" do
      expect(@password_form.persisted?).to be_falsey
    end

    it "#saveが常にtrue" do
      expect(@password_form.save).to be_truthy
    end
  end
end

テストを実行する時は以下のようにする。

% bundle exec rspec spec/forms/password_form_spec.rb