前提・実現したいこと
データベースに保存しないインスタンス変数のバリデーションをRspecでモデルテストを行うとエラーが表示されてしまいました。
前提:
郵便番号用に2つの入力欄(attr_accessorのcompany_zip_1、company_zip_2)を用意。
保存時は、company_zip_1とcompany_zip_2を' 'でjoinした値をcompany_zipカラムに保存。
バリデーションとして、company_zip_1とcompany_zip_2を入力必須にする。
発生している問題・エラーメッセージ
is invalid without a company_zip_1 (FAILED - 1)
1) Company is invalid without a company_zip_1 Failure/Error: expect(@company).not_to be_valid expected #<Company id: 1, company_zip: " 6126", created_at: "2019-08-16 05:55:42", updated_at: "2019-08-16 05:55:42"> not to be valid
該当のソースコード
view
<div class="form-inputs"> <%= f.input :company_zip_1 %> <%= f.input :company_zip_2 %> </div>
model
attr_accessor :company_zip_1, :company_zip_2 validates :company_zip_1, :company_zip_2, presence: true # 初期値の設定(編集時など) def company_zip_1 company_zip.present? ? company_zip.split(' ').first : @company_zip_1 end def company_zip_2 company_zip.present? ? company_zip.split(' ').last : @company_zip_2 end # 保存時の設定 after_validation :set_company_zip def set_company_zip self.company_zip = [@company_zip_1, @company_zip_2].join(' ') end
rspec
RSpec.describe Company, type: :model do before do @company = Company.create( company_zip_1: "106", company_zip_2: "6126", ) end # 住所(zip1)がなければ無効な状態であること it "is invalid without a company_zip_1" do @company.update(company_zip_1: "") expect(@company).not_to be_valid end # 郵便番号のインスタンスメソッドの動作確認 it "join company_zip_1 and company_zip_2" do expect(@company.company_zip).to eq "106 6126" end end
試したこと
・Everyday Rails - RSpecによるRailsテスト入門にてattr_accesorについて検索⇒該当なし
・ネットで検索したのですが、該当する回答をうまく見つけることができませんでした。
気になること
errorにあるようにexpectedの内容が下記のようになっています。
・company_zipのみが表示される => company_zip_1は表示されない
・company_zip: ” 6126" となっており、company_zip_1=“”、company_zip_2=“6126" を' ’でjoinした形になっている
そのためテーブルにカラムを持っていないattr_accessorは、Rspecでテストできない、または簡単にはできないのではと思っています。
補足情報(FW/ツールのバージョンなど)
rails 5.2.3
ruby 2.6.3
追記
実際の画面上で動作確認すると期待通りの動きができています。