実装概要
- itemモデルの単体テストを実施
item情報をFactoryBotで指定
spec/factories/items.rb
FactoryBot.define do
factory :item do
name { Faker::Name.initials(number: 2) }
description { Faker::Lorem.sentence }
category_id { 2 }
status_id { 2 }
shipping_fee_id { 2 }
prefecture_id { 2 }
delivery_time_id { 2 }
price { 500 }
association :user
after(:build) do |message|
message.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
end
end
end
テスト用のダミー画像を用意
publicディレクトリ配下にimageフォルダを作成し、test_image.pngに名称変更し保存
コンソールでFactoryBotが使用できることを確認
ターミナル
% rails c
pry(main)> FactoryBot.create(:item)
画像がActive Storageに保存できているか確認
ターミナル(コンソール)
pry(main)> item.image.attached?
# 省略
=> true
itemモデルの単体テストコードを記述
spec/models/item_spec.rb
require 'rails_helper'
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
end
describe '商品出品' do
context '商品出品できるとき' do
it 'nameとdescriptionとprice(300から9999999)と画像が存在しており、category_id、status_id、shipping_fee_id、prefecture_idが2以上が選択されているとき' do
expect(@item).to be_valid
end
end
context '商品出品できないとき' do
it 'nameが空では出品できない' do
@item.name = ''
@item.valid?
expect(@item.errors.full_messages).to include "Name can't be blank"
end
it 'descriptionが空では出品できない' do
@item.description = ''
@item.valid?
expect(@item.errors.full_messages).to include "Description can't be blank"
end
it '画像が空では出品できない' do
@item.image = nil
@item.valid?
expect(@item.errors.full_messages).to include "Image can't be blank"
end
it 'category_idが1では出品できない' do
@item.category_id = 1
@item.valid?
expect(@item.errors.full_messages).to include "Category can't be blank"
end
it 'status_idが1では出品できない' do
@item.status_id = 1
@item.valid?
expect(@item.errors.full_messages).to include "Status can't be blank"
end
it 'shipping_fee_idが1では出品できない' do
@item.shipping_fee_id = 1
@item.valid?
expect(@item.errors.full_messages).to include "Shipping fee can't be blank"
end
it 'prefecture_idが1では出品できない' do
@item.prefecture_id = 1
@item.valid?
expect(@item.errors.full_messages).to include "Prefecture can't be blank"
end
it 'delivery_time_idが1では出品できない' do
@item.delivery_time_id = 1
@item.valid?
expect(@item.errors.full_messages).to include "Delivery time can't be blank"
end
it 'priceが空では出品できない' do
@item.price = ''
@item.valid?
expect(@item.errors.full_messages).to include "Price can't be blank"
end
it 'priceが全角数字では登録できない' do
@item.price = '500'
@item.valid?
expect(@item.errors.full_messages).to include 'Price is not a number'
end
it 'priceが300未満では出品できない' do
@item.price = 299
@item.valid?
expect(@item.errors.full_messages).to include 'Price must be greater than or equal to 300'
end
it 'priceが1000万以上では出品できない' do
@item.price = 10_000_000
@item.valid?
expect(@item.errors.full_messages).to include 'Price must be less than or equal to 9999999'
end
it 'userが紐づいていないと出品できない' do
@item.user = nil
@item.valid?
expect(@item.errors.full_messages).to include 'User must exist'
end
end
end
end
テスト実行
ターミナル
% bundle exec rspec spec/models/item_spec.rb
テストが問題なく完了したことを確認。
コードレビューを依頼して、結果を待ちます!!