Rails, mongoid, RSpec: 全コレクションの消去

mongoid で MongoDB を利用した Rails アプリケーションを作っているのだが、RSpec のバージョンを 2.0.0.beta.19 に上げたら、specs 実行時に次のようなエラーが出て止まる現象に遭遇。


/usr/lib/ruby/gems/1.8/gems/activesupport-3.0.0.rc
/lib/active_support/whiny_nil.rb:48:in `method_missing':
undefined method `set_exception' for nil:NilClass
(NoMethodError)

調べると、Rspec.configure を使って定義した before(:each) エグザンプル等の中で例外が発生すると、うまく補足できなくて、こんなエラーになるようだ。

そこで、即席の例外処理を書いて何が起きているかを調べると、次のようなエラーメッセージが出ている。


Database command 'drop' failed:
{"ns"=>"foo_test.system.indexes", "errmsg"=>"exception:
can't drop system ns", "code"=>12502, "ok"=>0.0}(Mongo::OperationFailure)

Google で検索すると Quick Fix に解決法が載っていた。

修正前の spec/spec_helper.rb はこんな感じ:


Rspec.configure do |config|
# (省略)

config.before :all do
Mongoid.master.collections.each(&:drop)
end
end

これを次のように変える。


Rspec.configure do |config|
# (省略)

config.before :all do
Mongoid.master.collections.
select { |c| c.name != 'system.indexes' }.each(&:drop)
end
end

どうやら、mongoid のバージョンを 2.0.0.beta.16 に上げたため、system.indexes という collection が drop できなくなったらしい。

[参考資料]