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 できなくなったらしい。
[参考資料]