Rails 4: จะรีเซ็ตฐานข้อมูลทดสอบได้อย่างไร?


88

ฉันใช้ Rails 4 และสังเกตเห็นว่าการทดสอบ RSpec ของฉันล้มเหลวเนื่องจากการปรับโครงสร้างการทดสอบบางส่วนของฉันใช้ตัวกรองก่อน (น่าจะเป็นเพราะการทำธุรกรรม) โพสต์นี้อธิบายถึงปัญหาที่คล้ายกัน:

ฐานข้อมูลทดสอบรางไม่ล้างหลังจากการทำงานบางครั้ง

แทนการใช้อัญมณี DatabaseCleaner มีคำสั่ง rake เพื่อล้างฐานข้อมูลทดสอบหรือไม่? ฉันเชื่อว่าrake db:test:prepareเลิกใช้แล้วใน Rails 4 นอกจากนี้หากก่อนทำธุรกรรมเช่น

post :create, user: Fabricate.attributes_for(:user)

ยังคงอยู่ มีวิธีอื่นในการปรับโครงสร้างใหม่เพื่อหลีกเลี่ยงความจำเป็นในการล้างฐานข้อมูลทดสอบด้วยตนเองหรือไม่?

คำตอบ:


121

วิธีแก้ปัญหา overkill คือ:

bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
bundle exec rake db:schema:load RAILS_ENV=test

คุณสามารถทำให้ทั้งหมดนี้เป็นงานคราดและเรียกใช้สิ่งนั้น

อีกวิธีหนึ่งจากที่นี่คือการรวมspec_helper.rbไฟล์ของคุณต่อไปนี้

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

ข้อจำกัดความรับผิดชอบ: ฉันยังไม่ได้ทดสอบสิ่งนี้และคุณควรอ่านโพสต์ SOเนื่องจากอาจใช้ไม่ได้ในทุกสถานการณ์

ดังที่กล่าวไว้ฉันขอแนะนำให้ใช้อัญมณีทำความสะอาดฐานข้อมูลเพื่อหลีกเลี่ยงสถานการณ์เช่นนี้


1
3 rake db แรก: * อาจถูกแทนที่ด้วยรายการสุดท้ายเท่านั้นเนื่องจากลบตารางทั้งหมดและสร้างจากสคีมา
konole

2
สำหรับ Rails 5 ใช้ApplicationRecordแทนActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke

3
ใช้rake db:structure:loadถ้าคุณใช้ structure.sql แทน schema.rb
Archonic

2
ซับ neater 1 สำหรับด้านบนเป็นเพียง:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667

98

มันสามารถ:

bundle exec rake db:reset RAILS_ENV=test

21
ฉันสังเกตเห็นว่ายังวิ่งrake db:seed ... ซึ่งอาจจะเป็นปัญหาหรือไม่ก็ได้
Harry Wood

1
ในกรณีที่คุณใช้ Rails 5 ตอนนี้คำสั่งจะเป็นรางแทนคราด:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández

19

บางครั้งคุณอาจต้องรันคำสั่งนี้ (ทางเลือก)

rails db:environment:set RAILS_ENV=test

แต่แน่นอนว่าการล้างฐานข้อมูลทดสอบของคุณควรทำได้ง่ายพอ ๆ กับ:

rails db:drop db:create db:migrate RAILS_ENV=test


2

คุณสามารถเพิ่มตัวกรอง after เพื่อลบรายการทั้งหมดจากตารางที่เกี่ยวข้อง


0

ในทางทฤษฎีActiveRecord::Migration.maintain_test_schema!ควรทำเคล็ดลับ ใส่เข้าไปrails_helper.rb


0

ฉันลงเอยด้วยการเขียนงานคราดง่ายๆที่ดร็อป / โยกย้าย (หรือดร็อปและโยกย้าย) ฐานข้อมูลการทดสอบและการพัฒนาทั้งหมดขึ้นอยู่กับคำสั่งที่เรียกใช้

รวมถึงฟังก์ชันการทำงานเพื่อแจ้งให้ผู้ใช้ทราบว่าพวกเขาต้องการดำเนินการต่อเมื่อเกิดข้อผิดพลาดหรือไม่และใช้เมธอด popen3 ของ Open3 (เช่นเราสามารถเข้าถึง stdin, stdout และ stderr ได้และคำสั่งที่ล้มเหลวใด ๆ จะไม่ส่งผลให้เกิดกระบวนการคราด การยกเลิก (ไม่เหมือนเมื่อใช้ระบบ ))

หวังว่านี่จะช่วยใครบางคนได้ :)

https://github.com/xtrasimplicity/rake_all_db_helper/

แก้ไข: สิ่งนี้จะต้องดำเนินการด้วยตนเองจากเชลล์ของคุณเมื่อใดก็ตามที่คุณต้องการล้างฐานข้อมูลของคุณ

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