Karn Tirasoontorn

June 18, 2021

ลองใช้ Factory Bot แทน Fixtures ดู

ปกติแล้วโปรเจค Rails ใหม่ๆ ที่ถูกสร้างขึ้นมาจะติดตั้ง minitest เป็นเฟรมเวิร์คในการทดสอบตั้งต้น และใช้ fixtures ในการสร้างข้อมูลตัวอย่างทดสอบ

ติดตั้ง  Factory Bot ให้กับโปรเจค

  • เพิ่ม `factory_bot_rails` เข้าไปใน Gemfile

group :development, :test do 
  gem 'factory_bot_rails' 
end 

  • อย่าลืม bundle install

ลงมือทดสอบ

  • ลองสร้างโมเดล User ขึ้นมา

ถ้าไม่ได้ติดตั้ง `factory_bot_rails` เมื่อสร้างโมเดลขึ้นมา generator จะเลือกใช้ fixtures ตามค่ามาตรฐานดังแสดงในรูปด้านซ้าย

แต่เมื่อทำการติดตั้ง `factory_bot_rails` แล้ว generator จะเลือกใช้ Factory Bot ในการสร้างข้อมูลตัวอย่าง ดังแสดงในรูปด้านขวา ทั้งนี้เพราะ `factory_bot_rails` ได้ override ค่า `fixture_replacement` ให้เป็น `:factory_bot` แทนแล้ว


  • migrate ข้อมูลฐานเทส

RAILS_ENV=test rails db:migrate

  • กำหนดค่าให้ minitest รองรับการใช้งาน Factory Bot โดยให้เพิ่ม `include FactoryBot::Syntax::Methods` เข้าไปใน `test_helper.rb`

class ActiveSupport::TestCase  
  include FactoryBot::Syntax::Methods
end

  • เพิ่มเติมข้อมูลตัวอย่าง User เข้าไปใน `test/factories/users.rb
    • สร้างข้อมูลตัวอย่างชื่อ :user
    • กำหนดชื่อ demo

FactoryBot.define do  
  factory :user do
    name { "demo" }  
  end
end

  • เขียนเทสเพื่อทดสอบ User ใน `test/models/user_test.rb`

require "test_helper"

class UserTest < ActiveSupport::TestCase
  test "have demo user" do
    user = create(:user)
    assert user
    assert_equal user.name, "demo"
  end
end

  • เทสหน่อย

ความรู้สึกระหว่าง Fixtures และ Factory Bot

โดยส่วนตัวแล้วการใช้งาน Fixtures น่าจะตรงไปตรงมากว่า Factory Bot เพราะเป็นการนิยามข้อมูลเป็นก้อนๆ เก็บไว้ใน YML จากนั้นก็โหลดเข้าไปเทส แต่ของ Factory Bot ก็จะถูกออกแบบโดยใช้หลักการของ Factory ซึ่งทำให้ใน 1 คลาส ก็จะมีแค่ 1 Factory ไว้ใช้ในการจัดการข้อมูล

สำหรับการเลือกใช้ตัวไหนอาจะต้องไปทดลองใช้กันดูนะครับ ว่าถูกจริตกับเครื่องมือตัวไหนมากกว่ากัน แต่ไม่ว่าจะเลือกใช้ตัวใด นั้นแสดงว่าคุณได้มีการเขียนเทสโปรแกรมของคุณซึ่งนั้นเป็นเรื่องที่ดีที่สุดแล้วหละครับ


References: