2011-07-05 24 views
14

Khi tôi chạy thử nghiệm rspec, nhiều lỗi không thành công do dữ liệu cũ trong cơ sở dữ liệu mongodb của tôi. AFAIK nó là tốt hơn để thử nghiệm với một cơ sở dữ liệu sạch sẽ.Làm sạch hoặc đặt lại cơ sở dữ liệu thử nghiệm bằng Rspec và MongoID trên Rails 3

Với mysql, tôi có thể chạy rake db:test:prepare để xóa cơ sở dữ liệu. Làm thế nào tôi có thể làm sạch nd/hoặc tái hạt giống cơ sở dữ liệu trước mỗi bài kiểm tra?

Trả lời

16

Nếu bạn đang sử dụng MongoID, bạn có thể sử dụng Database Cleaner với Cắt ngắn chiến lược. Ví dụ:

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 

    config.before :each do 
    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner.start 
    end 

    config.after do 
    DatabaseCleaner.clean 
    end 
end 
18

IMHO, Đây là một giải pháp tốt hơn nhiều so với cài đặt một viên ngọc với mục đích cụ thể của cơ sở dữ liệu làm sạch của bạn .... 3 dòng để đi trong spec_helper.rb của bạn:

RSpec.configure do |config| 
    #Other config stuff goes here 

    # Clean/Reset Mongoid DB prior to running the tests 
    config.before :each do 
    Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop) 
    end 
end 

Ghi có: A user named Alex posted this as a solution for a similar question.

+9

Nếu bạn đang sử dụng ** Mongoid 3 **, bạn sẽ cần một cái gì đó như: 'Mongoid.default_session.collections.select {| c | c.name! ~/system /} .each (&: drop) ' – Alessandro

+7

Điều này là hoàn toàn nitpicky và thực sự có lẽ không quan trọng chút nào nhưng giải pháp của bạn là một chút không hiệu quả. Bạn đang lặp qua tất cả các bộ sưu tập một lần để chọn và sau đó trên tập hợp con trong mỗi bộ sưu tập. Điều này chỉ lặp lại các bộ sưu tập một lần: 'Mongoid.default_session.collections.each {| coll | coll.drop trừ khi /^system/.match(coll.name)} ' –

30

Không có câu trả lời nào khác phù hợp với tôi với Mongoid 3.0. Tôi đã từng trả lời @Batkins sửa đổi như vậy

RSpec.configure do |config| 

    # Clean/Reset Mongoid DB prior to running each test. 
    config.before(:each) do 
    Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/ }.each(&:drop) 
    end 
end 

Ngoài ra, nếu bạn muốn để trống bộ sưu tập nhưng không muốn thả nó (có thể bạn có chỉ số hoặc một cái gì đó), làm được điều này

Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/}.each {|c| c.find.remove_all} 
+1

Xin lỗi. Tôi đã nhận xét về câu trả lời ở trên mà không thấy câu trả lời của bạn. Upvoted là 'Mongoid :: Sessions.default' hoạt động tốt như' Mongoid.default_session'. – Alessandro

+0

@Alessandro - Cảm ơn, tôi không biết về Mongoid.default_session – declan

7

trong Mongoid v2.0.2

before(:each) do 
    Mongoid.purge! 
end 

Rdoc: Mongoid.purge!

+0

Đã không hoạt động khi tôi thử câu trả lời đã chọn, vẫn còn một số bản ghi được tạo ra bằng cách nào đó, điều này đã giúp tôi. Và các bài kiểm tra đáng chú ý là nhanh hơn như một kết quả nào đó. – randomor

+0

tôi nghĩ bạn muốn Mongoid :: Config.purge! – bonhoffer

+0

'Mongoid.purge!' Làm việc cho tôi với 4.0.2 và tôi nghĩ nó tốt hơn là sử dụng DatabaseCleaner. –

2

add để gemfile:

gem 'database_cleaner', :github => 'bmabey/database_cleaner' 

chạy bundle install

thêm video này vào spec_helper của bạn:

config.before(:suite) do 
    DatabaseCleaner[:mongoid].strategy = :truncation 
    DatabaseCleaner[:mongoid].clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

tín dụng đầy đủ đi: http://blog.codelette.com/2013/07/07/make-rspec-clean-up-mongoid-records/

+0

Tại sao bạn chỉ xóa câu hỏi của mình về các biến lớp?Đó là một câu hỏi hay và tôi có câu trả lời cho bạn. –

Các vấn đề liên quan