2011-07-05 5 views
14

rspecテストを実行すると、mongodbデータベースの古いデータが原因で多くのエラーが発生します。 AFAIKは、クリーンなデータベースでテストする方がはるかに優れています。RspecとMongoID on Rails 3でテストデータベースを消去またはリセットする

mysqlを使用すると、rake db:test:prepareを実行してデータベースをクリーンアップすることができました。どのようにして各テストの前にデータベースをクリーンアップ/再シードできますか?

答えて

16

MongoIDを使用している場合は、Database Cleanerの切り捨て戦略を使用できます。例:

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、これはあなたのデータベースを掃除する特定の目的のために宝石をインストールするよりもはるかに良くソリューションです.... 3行あなたのspec_helper.rbに行くために:

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 

クレジット:A user named Alex posted this as a solution for a similar question.

+9

** Mongoid 3 **、あなたは意志次のようなものが必要です: 'Mongoid.default_session.collections.select {| c | c.name!〜/ system /} .each(&:drop) ' – Alessandro

+7

これはまったくニッキーであり、実際にはまったく問題ではありませんが、あなたのソリューションは少し非効率です。選択のためにすべてのコレクションを一度繰り返し、それぞれのコレクションのサブセットを繰り返します。 これはコレクションを1回だけ繰り返します: 'Mongoid.default_session.collections.each {| coll | coll.dropを除いて/^system/.match(coll.name)} ' –

30

Mongoid 3.0と他の回答はどちらも役に立ちません。私は@Batkins答えはあなたがコレクションを空にしたい場合は、代わりにその

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 

のように変更されますが、この

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

申し訳ありません。私はあなたの答えを見ずに、上記の返答にコメントしました。 'Mongoid :: Sessions.default'は、' Mongoid.default_session'と同じくらいうまく動作します。 – Alessandro

+0

@Alessandro - ありがとう、私はMongoidについて知りませんでした.default_session – declan

7

を行う、(多分あなたはインデックスや何かを持っている)、それをドロップしたくない使用しましたMongoid v2.0.2で

before(:each) do 
    Mongoid.purge! 
end 

Rdoc: Mongoid.purge!

+0

選択された回答を試してもうまくいかず、何らかの形で作成されたレコードが残っていました。そして結果的にテストは明らかに速くなります。 – randomor

+0

私はMongoid :: Config.purgeが欲しいと思います! – bonhoffer

+0

'Mongoid.purge!'は4.0.2で動作し、DatabaseCleanerを使うよりも優れていると思います。 –

2

gemfileに追加:

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

実行bundle install

あなたspec_helperにこれを追加します。

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 

フルクレジットは、に行く:あなたが使用している場合 http://blog.codelette.com/2013/07/07/make-rspec-clean-up-mongoid-records/

+0

なぜあなたは単にクラス変数に関するあなたの質問を削除しましたか?それは良いものでした。私はあなたに答えました。 –

関連する問題