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