2011-01-14 24 views
19

Làm thế nào để viết thử nghiệm đơn vị thích hợp (và thử nghiệm tích hợp cho vấn đề đó) bằng MongoDB thông qua Mongoid trên Rails?Cách thực hiện kiểm tra cơ sở dữ liệu thích hợp (TDD) trên Rails 3 bằng MongoDB và Mongoid

Tôi hỏi, vì ngược lại với việc sử dụng giả sử SQLite3, ngay cả khi chạy thử nghiệm, mọi thứ tôi làm vẫn tồn tại. Vì vậy, hiện tại tôi đang viết bài kiểm tra sáng tạo và sau đó tôi xóa tất cả mọi thứ tôi làm theo cách thủ công. Nhưng nó nhận được gây phiền nhiễu và thậm chí phức tạp để làm cho thử nghiệm tích hợp.

Mẫu những gì tôi làm:

before(:each) do 
    @user = User.create!(@attr) 
end 

after(:each) do 
    # MongoDB is not a transactional DB, so added objects (create) during tests can't be rollbacked 
    # checking for the existance of a similar object with exact :name and :email (regex make it case insensitive) 
    cleanup = User.where(:name => "Example User", :email => /^[email protected]/i) 
    cleanup.destroy unless cleanup.nil? 
end 

Bất kỳ ý tưởng làm thế nào để làm cho MongoDB không dai dẳng trong kiểm tra? (Tôi thậm chí không thể chạy giao diện điều khiển trong chế độ hộp cát bởi vì để sử dụng Mongoid tôi đã phải tắt Active Record).

Trả lời

4

Không có cách nào để làm cho MongoDB không liên tục. Bạn chỉ cần xóa dữ liệu trước hoặc sau mỗi lần kiểm tra. Có một số tài liệu trên đó ở đây:

http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing

+0

Cảm ơn, đó là những gì tôi đã sợ ... Tốt liên kết tuy nhiên, tôi nghĩ rằng tôi đã đọc qua các trang MongoDB hoàn chỉnh, nhưng chưa rõ ràng :) Tôi sẽ thử giải pháp đó để tránh phải thêm mã thủ công mỗi khi tôi viết bài kiểm tra. – Alex

12

Ok nhờ Kyle ai chỉ cho tôi đi đúng hướng, tôi phát hiện ra làm thế nào để làm cho nó làm việc.

Vì vậy, về cơ bản, mẹo là thả tất cả các bộ sưu tập của bạn trong mongodb cho từng trường hợp thử nghiệm mà bạn sẽ chạy. Đây là một chút cấp tiến, nhưng nó hoạt động. Nhưng hãy nhớ rằng bạn sẽ không giữ lại bất kỳ dữ liệu nào cả trong khi bạn thử nghiệm db.

Cuối cùng tôi phát hiện ra rằng liên kết: http://adventuresincoding.com/2010/07/how-to-configure-cucumber-and-rspec-to-work-with-mongoid

Và về cơ bản những gì bạn cần làm là đơn giản:

thêm một khối trong bạn spec_helper.rb:

RSpec.configure do |config| 

# blabla other confs 

    config.before :each do 
    Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop) 
    end 

# blabla other confs 

end 

Đối Mongoid 3:

Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop 

Điều này giết chết tất cả bộ sưu tập trong db cho phép bạn chạy thử nghiệm của bạn tươi mỗi lần.

Alex

+0

Tài liệu mongoid cũng đề cập đến điều này.Bạn cũng có thể sử dụng đá quý database_cleaner http://mongoid.org/docs/integration/ – Christos

+0

Cảm ơn bạn. Điều này là đẹp hơn rất nhiều so với việc phải lo lắng về một viên ngọc cụ thể để làm sạch cơ sở dữ liệu haha. – Batkins

+0

@Christos, liên kết mà bạn đề cập bị hỏng. –

5

Một cách khác là sử dụng database_cleaner. Nó hỗ trợ nhiều ORMs, vì vậy tôi nghĩ rằng bạn có thể làm một cái gì đó như thế này:

# spec/support/database_cleaner.rb 
RSpec.configure do |config| 
    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 
end 
2

Đây là những gì tôi đã làm (sử dụng Test :: Unit và Mongoid 3) ...

# test/test_helper.rb 
setup { 
    Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop) 
} 
2

một này làm việc cho tôi.

Trong spec_helper.rb, dưới RSpec.configure do |config| tôi đặt:

config.before :each do 
    Mongoid.purge! 
end 

Reference.

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