Rails 4: Làm thế nào để đặt lại cơ sở dữ liệu thử nghiệm?


87

Tôi đang sử dụng Rails 4 và đã nhận thấy một số bài kiểm tra RSpec của tôi không thành công vì một số lần tái cấu trúc thử nghiệm của tôi sử dụng bộ lọc trước (có lẽ là do các giao dịch). Bài đăng này mô tả một vấn đề tương tự:

cơ sở dữ liệu kiểm tra rails không xóa sau một số lần chạy

Thay vì sử dụng đá quý DatabaseCleaner, có lệnh rake để xóa cơ sở dữ liệu thử nghiệm không? Tôi tin rằng rake db:test:preparekhông được dùng nữa trong Rails 4. Ngoài ra, nếu trước các giao dịch như

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

kiên trì. Có cách nào khác để cấu trúc lại để tránh phải xóa thủ công cơ sở dữ liệu thử nghiệm không?

Câu trả lời:


120

Một giải pháp quá mức cần thiết sẽ là:

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

Bạn có thể thực hiện tất cả điều này trong một nhiệm vụ cào và chạy nó.

Một giải pháp khác từ đây là đưa vào spec_helper.rbtệp của bạn sau

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

Tuyên bố từ chối trách nhiệm: Tôi chưa thử nghiệm điều này và bạn nên đọc bài đăng SO vì nó có thể không hoạt động trong mọi tình huống.

Điều đó đang được nói, tôi khuyên bạn nên sử dụng gem dọn dẹp cơ sở dữ liệu để tránh những trường hợp như thế này.


1
3 rake db đầu tiên: * chỉ có thể được thay thế bằng cái cuối cùng vì nó xóa tất cả các bảng và tạo chúng khỏi lược đồ.
konole

2
cho Rails 5, hãy sử dụng ApplicationRecordthay vì ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke

3
Sử dụng rake db:structure:loadnếu bạn đang sử dụng struct.sql thay vì schema.rb.
Archonic

2
Một lót gọn gàng 1 cho ở trên chỉ đơn giản là:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667

98

Nó có thể:

bundle exec rake db:reset RAILS_ENV=test

20
Tôi nhận thấy rằng cũng chạy rake db:seed ... mà có thể hoặc không thể là một vấn đề
Harry Gỗ

1
Trong trường hợp bạn đang sử dụng Rails 5, lệnh tại là đường ray thay vì cào:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández

15

Đôi khi bạn có thể cần chạy lệnh này (tùy chọn)

rails db:environment:set RAILS_ENV=test

Nhưng chắc chắn việc xóa sạch cơ sở dữ liệu thử nghiệm của bạn phải dễ dàng như sau:

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


2

Bạn có thể thêm một bộ lọc sau khi xóa tất cả các mục từ các bảng có liên quan.


0

Về lý thuyết, điều này ActiveRecord::Migration.maintain_test_schema!sẽ thực hiện thủ thuật. Đặt nó trongrails_helper.rb


0

Tôi đã kết thúc bằng cách viết một tác vụ rake đơn giản làm giảm / di chuyển (hoặc giảm và di chuyển) tất cả các cơ sở dữ liệu kiểm tra và phát triển, tùy thuộc vào lệnh được thực thi.

Nó bao gồm chức năng nhắc người dùng về việc họ có muốn tiếp tục khi có lỗi xảy ra hay không và sử dụng phương thức popen3 của Open3 (để chúng tôi có thể truy cập stdin, stdout và stderr; và bất kỳ lệnh nào bị lỗi đều không dẫn đến quá trình của tác vụ rake hủy bỏ (không giống như khi sử dụng hệ thống )).

Hy vọng rằng điều này sẽ giúp ai đó. :)

https://github.com/xtrasimparies/rake_all_db_helper/

chỉnh sửa: Tuy nhiên, điều này sẽ cần được thực thi thủ công từ trình bao của bạn, bất cứ khi nào bạn muốn xóa cơ sở dữ liệu của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.