อะไรคือความแตกต่างระหว่างวิธีการสร้างและการสร้างใน FactoryGirl?


97

บทนำของ Factory Girl จะอธิบายความแตกต่างระหว่างFactoryGirl.build()และFactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

ฉันยังไม่เข้าใจความแตกต่างในทางปฏิบัติระหว่างทั้งสอง ใครช่วยยกตัวอย่างที่คุณต้องการใช้ไม่ใช่อีกแบบ ขอบคุณ!

คำตอบ:


121

create()วิธีการยังคงมีอยู่เช่นรูปแบบในขณะที่build()วิธีการทำให้มันเฉพาะในหน่วยความจำ

โดยส่วนตัวแล้วฉันใช้create()วิธีนี้ก็ต่อเมื่อความคงอยู่เป็นสิ่งที่จำเป็นจริงๆเนื่องจากการเขียนลง DB ทำให้การทดสอบใช้เวลานาน

เช่น

ฉันสร้างผู้ใช้เพื่อพิสูจน์ตัวตนด้วยcreate()เนื่องจากเอ็นจินการพิสูจน์ตัวตนของฉันค้นหา DB

ในการตรวจสอบว่าโมเดลมีแอ็ตทริบิวต์หรือไม่build()เมธอดจะทำเนื่องจากไม่จำเป็นต้องเข้าถึง DB

it{Factory.build(:user).should respond_to(:name)}

อัปเดต

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


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

@ เชคฉันไม่ทำงานในรางอีกต่อไป ฉันจะตรวจสอบโดยเร็วที่สุด
Helio Santos

มีใครทำเครื่องมือเพื่อแทนที่แต่ละอินสแตนซ์createด้วยbuildและเลิกทำหากการทดสอบล้มเหลว
mgold

ไม่#createอ่านและส่งคืนวัตถุ persisted จากดิสก์หรือไม่ก็กลับวัตถุที่อยู่ในหน่วยความจำหลังจาก persisting มันได้หรือไม่ กล่าวอีกนัยหนึ่งกำลังทำได้create(...)เทียบเท่ากับcreate(...).reload?
Dennis

@mgold Vim ค่อนข้างดีในเรื่องนั้น
lmat - คืนสถานะ Monica

15

การใช้FactoryGirl.build(:factory_name)ไม่คงอยู่กับฐานข้อมูลและไม่เรียกใช้save!ดังนั้นการตรวจสอบ Active Record ของคุณจะไม่ทำงาน ซึ่งเร็วกว่ามาก แต่การตรวจสอบความถูกต้องอาจมีความสำคัญ

การใช้FactoryGirl.create(:factory_name)จะยังคงอยู่กับฐานข้อมูลและจะเรียกใช้การตรวจสอบระเบียนที่ใช้งานอยู่ เห็นได้ชัดว่าช้ากว่า แต่สามารถตรวจจับข้อผิดพลาดในการตรวจสอบความถูกต้อง (หากคุณสนใจเกี่ยวกับข้อผิดพลาดเหล่านี้ในการทดสอบของคุณ)


11
หรือคุณสามารถทำ FactoryGirl.build (: factory_name) ได้ถูกต้อง? ซึ่งเรียกใช้การตรวจสอบความถูกต้องโดยไม่บันทึกลงในฐานข้อมูล
jinavar1

1

FactoryGirl.create()จะสร้างออบเจ็กต์และการเชื่อมโยงใหม่ (ถ้าโรงงานมี) ให้ พวกเขาทั้งหมดจะยังคงอยู่ในฐานข้อมูล นอกจากนี้จะเรียกใช้ทั้งการตรวจสอบโมเดลและฐานข้อมูล การโทรกลับafter(:build)และafter(:create)จะถูกเรียกหลังจากโรงงานได้รับการบันทึก และbefore(:create)จะถูกเรียกก่อนที่โรงงานจะได้รับการบันทึก

FactoryGirl.build()จะไม่บันทึกวัตถุ แต่จะยังคงร้องขอไปยังฐานข้อมูลหากโรงงานมีการเชื่อมโยง จะทริกเกอร์การตรวจสอบความถูกต้องสำหรับวัตถุที่เกี่ยวข้องเท่านั้น after(:build)จะมีการโทรกลับหลังจากสร้างโรงงานแล้ว

โปรดทราบว่าในกรณีส่วนใหญ่เมื่อทดสอบโมเดลควรใช้build_stubbedเพื่อประสิทธิภาพที่ดีขึ้น อ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.