前提・実現したいこと
ユーザー(selller)と住所(address_seller)を一緒に登録する機能のモデルのテストコードを実装したいのですが、バリデーションがうまく作用せず
どのように実装したら良いのか悩んでおります。
ローカルで動かしている時はしっかりバリデーションが作用しています。
発生している問題・エラーメッセージ
バリデーションが作用せず、からのデータがあったとしても@〜.valid?でtrueに返されてしまう。
該当のソースコード
spec モデルテストコード
require 'rails_helper' RSpec.describe AddressSeller, type: :model do describe '#create' do before do @address_seller = FactoryBot.build(:address_seller) end context '商品購入できるとき' do it '全ての項目の入力が存在すれば登録できること' do expect(@address_seller).to be_valid end it '建物名が存在しなくても登録できること' do @address_seller.house_number = "" expect(@address_seller).to be_valid end end context '商品購入できないとき' do it '郵便番号が空では登録できない' do @address_seller.postal_code = '' @address_seller.valid? binding.pry expect(@address_seller.errors.full_messages).to include() end end end end
spec FactoryBot
FactoryBot.define do factory :address_seller do postal_code { "333-3333" } area { '東京' } city { "浜田市" } block_number { "夕香の塔" } house_number { "309-11" } phone_number { "11111111111" } seller_id { 1 } end end
address_seller モデル
class AddressSeller < ApplicationRecord belongs_to :seller, optional: true include Addressable end
concerns
module Addressable extend ActiveSupport::Concern included do with_options presence: true do validates :postal_code, format:{with: /\A\d{3}[-]\d{4}\z/} validates :area validates :city validates :block_number validates :phone_number, format:{with:/\A\d{11}\z/} end end end
devise sellers コントローラー
class Sellers::RegistrationsController < Devise::RegistrationsController # before_action :configure_sign_up_params, only: [:create] # before_action :configure_account_update_params, only: [:update] # GET /resource/sign_up def new @seller = Seller.new end def create @seller = Seller.new(sign_up_params) unless @seller.valid? render :new and return end session["devise.regist_data"] = {seller: @seller.attributes} session["devise.regist_data"][:seller]["password"] = params[:seller][:password] @address = @seller.build_address_seller render :new_address end def create_address @seller = Seller.new(session["devise.regist_data"]["seller"]) @address = AddressSeller.new(address_params) unless @address.valid? render :new_address and return end @seller.build_address_seller(@address.attributes) @seller.save session["devise.regist_data"]["seller"].clear sign_in(:seller, @seller) end private def address_params params.require(:address_seller).permit(:postal_code, :area, :city, :block_number, :phone_number, :house_number) end end
試したこと
binding.pryを記述し、コンソール内でvalid?をしたところtrueと返ってきてしまいました。
concernsの記述を引用していたのでsellerモデルに直接バリデーション を書き込んでみましたがバリデーションは作用しなかったです。
ですのでローカルで確認しましたが、ローカルの方ではしっかりとバリデーションがかかっていました。
sellerのモデルテストコードは問題なく実装できました。
rails cでコンソールを立ち上げ、実際に手打ちでしていくとしっかりバリデーションがかかるのですが
この文章をspecファイルで bundle exec rspec spec/models/address_seller_spec.rb で一連のテストコードを流してしまうとtrueになってしまうようです。
*手入力
[1] pry(main)> address_seller = AddressSeller.new(postal_code: '', area: 'ここ', city: 'ここ', block_number: 'ここ', phone_number: '11111111111')
(0.9ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> #<AddressSeller:0x00007faf5adcb980
id: nil,
postal_code: "",
area: "ここ",
city: "ここ",
block_number: "ここ",
house_number: nil,
phone_number: "11111111111",
seller_id: nil,
created_at: nil,
updated_at: nil>
[2] pry(main)> address_seller.valid?
=> false
[3] pry(main)> address_seller.errors.full_messages
=> ["Postal code can't be blank", "Postal code is invalid"]
*binding.pryを記述しbundle exec rspec spec/models/address_seller_spec.rbした
id: nil,
postal_code: "",
area: "ここ",
city: "ここ",
block_number: "ここ",
house_number: nil,
phone_number: "11111111111",
seller_id: nil,
created_at: nil,
updated_at: nil>
[3] pry(#RSpec::ExampleGroups::AddressSeller::Create::Nested_2)> address_seller.valid?
=> true
初歩的なことかもしれませんが教えていただけると助かります。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー