2011-01-14 11 views
19

Wie würde das Schreiben von richtigen Komponententests (und Integrationstests für diese Angelegenheit) mit MongoDB über Mongoid on Rails gehen?Wie richtige Datenbank-Tests (TDD) auf Rails 3 mit MongoDB und Mongoid

Ich frage, weil auf das Gegenteil der Verwendung von sagen wir SQLite3, selbst wenn Tests ausgeführt werden, bleibt alles, was ich tue, bestehen. Im Moment schreibe ich den Kreationstest und lösche dann manuell alles, was ich mache. Aber es wird nervig und sogar kompliziert für Integrationstests.

Probe von dem, was ich tue:

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 

Jede Idee, wie MongoDB nicht persistent im Test zu machen? (Ich kann die Konsole nicht einmal im Sandbox-Modus laufen lassen, da ich Mongoid deaktivieren musste, um Active Record zu deaktivieren).

Antwort

4

Es gibt keine Möglichkeit, MongoDB nicht persistent zu machen. Sie müssen lediglich Daten vor oder nach jedem Test löschen. Es gibt einige Dokumentation auf dieser hier:

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

+0

Danke, das ist, was ich hatte Angst vor ... Gut Link aber ich dachte, dass ich durch die komplette mongoDB Seiten gelesen haben, aber anscheinend noch nicht :) Ich werde diese Lösung versuchen, um zu vermeiden, dass ich jedes Mal, wenn ich den Test schreibe, manuellen Code hinzufügen muss. – Alex

12

Ok dank Kyle, den ich in der richtigen Richtung, fand ich heraus, wie es funktioniert.

Also im Grunde ist der Trick, alle Ihre Sammlungen in mongodb für jeden Testfall, den Sie ausführen werden. Das ist ein bisschen radikal, aber es funktioniert. Bedenken Sie jedoch, dass Sie in Ihrer Test-Datenbank keine Daten behalten werden.

Schließlich fand ich diesen Link: http://adventuresincoding.com/2010/07/how-to-configure-cucumber-and-rspec-to-work-with-mongoid

Und im Grunde, was Sie tun müssen, ist einfach:

einen Block hinzufügen, in Ihnen 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 

Für Mongoid 3:

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

Dies tötet effektiv die gesamte Sammlung innerhalb der db damit Sie Ihre Tests jedes Mal frisch durchführen können.

Alex

+0

Die Mongodokumentation deckt dies ebenfalls ab.Sie können auch den database_cleaner Gem http://mongoid.org/docs/integration/ – Christos

+0

Vielen Dank. Das ist so viel schöner, als sich um ein Juwel speziell für die Reinigung der Datenbank sorgen zu müssen haha. – Batkins

+0

@Christos, der Link, den du erwähnt hast, ist kaputt. –

5

Ein anderer Weg ist database_cleaner zu verwenden. Es unterstützt mehrere ORMs, so dass ich glaube, Sie so etwas tun könnte:

# 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

Hier ist, was ich getan habe (Test mit :: Unit und Mongoid 3) ...

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

Dieser arbeitete für mich.

In spec_helper.rb unter RSpec.configure do |config| Ich habe:

config.before :each do 
    Mongoid.purge! 
end 

Reference.

Verwandte Themen