フォームオブジェクト(Form Object)の説明は以下参照。
- 肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳):これの3番目
- Rails4でFormオブジェクトを作る際に気をつける3つのポイント
- FormオブジェクトのURLの渡し方について
- Form object validations in Rails 4
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