フォームオブジェクト(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
endrspec-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