ให้เป็นหน้าที่ของมันเป็นหลัก Proc ยังแคชของมัน
หนึ่ง gotcha ที่ฉันพบทันทีพร้อมกับปล่อยให้ ... ในบล็อก Spec ที่กำลังประเมินการเปลี่ยนแปลง
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
คุณจะต้องแน่ใจว่าได้โทรlet
ออกนอกบล็อกที่คาดไว้ นั่นคือคุณกำลังโทรFactoryGirl.create
เข้าบล็อกการอนุญาตของคุณ ฉันมักจะทำสิ่งนี้โดยตรวจสอบว่าวัตถุนั้นยังคงอยู่
object.persisted?.should eq true
มิฉะนั้นเมื่อ let
บล็อกถูกเรียกครั้งแรกการเปลี่ยนแปลงในฐานข้อมูลจะเกิดขึ้นจริงเนื่องจากการสร้างอินสแตนซ์ขี้เกียจ
ปรับปรุง
เพียงแค่เพิ่มบันทึก ระวังการเล่นกอล์ฟรหัสหรือในกรณีนี้ rspec golf พร้อมคำตอบนี้
ในกรณีนี้ฉันแค่ต้องเรียกวิธีการบางอย่างที่วัตถุตอบสนอง ดังนั้นฉันขอร้อง_.persisted?
เมธอด _ บนวัตถุเป็นความจริง ทั้งหมดที่ฉันพยายามทำคือยกตัวอย่างวัตถุ คุณสามารถโทรว่างเปล่า หรือไม่มี เกินไป. ประเด็นไม่ใช่การทดสอบ แต่นำชีวิตของวัตถุโดยเรียกมันว่า
ดังนั้นคุณไม่สามารถ refactor
object.persisted?.should eq true
เป็น
object.should be_persisted
ในขณะที่วัตถุไม่ได้ถูกยกตัวอย่าง ... มันขี้เกียจ :)
อัปเดต 2
ใช้ประโยชน์จากการปล่อย! ไวยากรณ์สำหรับการสร้างวัตถุทันทีซึ่งควรหลีกเลี่ยงปัญหานี้โดยสิ้นเชิง หมายเหตุถึงแม้ว่ามันจะเอาชนะจุดประสงค์มากมายของความเกียจคร้านของการไม่ยอมให้
ในบางกรณีคุณอาจต้องการใช้ประโยชน์จากไวยากรณ์หัวเรื่องแทนการปล่อยให้เป็นจริงเพราะมันอาจให้ตัวเลือกเพิ่มเติมแก่คุณ
subject(:object) {FactoryGirl.create :object}