iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 27

Day 27: 小巧好用的自動化物件工廠 - Factory_Bot

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位 RoR 工程師,斜槓鼓手與行銷顧問。
每日一套件第 27 天,跟著我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!

Day 27: Factory_Bot

今天要講的常用套件是 FactoryBot,它的前身是 FactoryGirl。據說是因為某種政治正確的原因,而被迫改名為中性的Bot,不過這不是重點。這個套件的功能很單純,其實跟先前講的 Faker 目的有點類似,但功能不太一樣,主要是讓使用者簡單產生測試用的物件資料。

安裝與使用方式:

起手式~記得要裝的是 rails 版的

$ bundle add factory_bot_rails

然後放在 group :development, :test do 底下

如果你有用 RSpec,可以在 spec/rails_helper.rb 中加入設定:

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

開始使用

首先,我們要先在 factories 的目錄中建立一個工廠。
假設我們有一個 User model,我們就先建一個 user 的工廠,在factories/user.rb設定預設的屬性和狀態,工廠就可以開始運轉啦!!

FactoryBot.define do
  factory :user do
    name { 'Weber' }
    email { 'weber@example.com' }
  end
end

有一點要特別注意,不要在 unique 的欄位直接賦值,如下錯誤示範

FactoryBot.define do
  factory :user do
    first_name "Weber"
    last_name "Chen"
    id_number 'A001' #unique 欄位
  end
end

在測試中使用

在測試中,可以使用 FactoryBot 創造物件實體。
例如,在RSpec測試spec/models/user_spec.rb中,我們使用 FactoryBot.create(:user) 建造一個 User 實體,然後進行測試,如下:

RSpec.describe User, type: :model do
  it 'is valid with valid attributes' do
    user = FactoryBot.create(:user)
    expect(user).to be_valid
  end
end

自定你的小工廠:

既然是你的工廠,應該就要滿足你各種不同的測試需求。例如可以這樣做:

user = FactoryBot.create(:user, name: 'Alice', email: 'alice@example.com')

搭配 Faker 雙開使用

FactoryBot + Faker = 自動產生範例物件 + 不用想命名

FactoryBot.define do
  factory :user do
    first_name "Weber"
    last_name "Chen"
    phone_number { Faker::PhoneNumber.phone_number }
  end
end

超方便的應用,大家可以自己試試看。不過要注意,Faker 的數量是有限的喔,如果要產生的內容太多,可能會有寫入錯誤的產生。總之多嘗試吧!

我們明天見!


上一篇
Day 26: 有點小雞肋的 PDF 產生器 - wicked_pdf
下一篇
Day 28: 快速展開的後台管理工具 - Rails_admin
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言