Ale*_*lex 19 testing persistence ruby-on-rails mongodb mongoid
如何通过Mongoid on Rails使用MongoDB编写适当的单元测试(以及针对该问题的集成测试)?
我问,因为与使用让我们说SQLite3相反,即使在运行测试时,我所做的一切仍然存在.所以目前我正在编写创建测试,然后手动删除我所做的一切.但是对于集成测试而言,它变得烦人甚至复杂.
我做的样本:
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 => /^user@example.com/i)
cleanup.destroy unless cleanup.nil?
end
Run Code Online (Sandbox Code Playgroud)
知道如何在测试期间使MongoDB不持久吗?(我甚至无法在沙箱模式下运行控制台,因为使用Mongoid我必须停用Active Record).
Ale*_*lex 12
好的,谢谢Kyle指出我正确的方向,我发现了如何使它工作.
所以基本上诀窍是将你所有的集合放在mongodb中,用于你将运行的每个测试用例.这有点激进,但它确实有效.但请记住,您在测试数据库中根本不会保留任何数据.
最后我找到了链接:http: //adventuresincoding.com/2010/07/how-to-configure-cucumber-and-rspec-to-work-with-mongoid
基本上你需要做的就是简单:
在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
Run Code Online (Sandbox Code Playgroud)
对于Mongoid 3:
Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop
Run Code Online (Sandbox Code Playgroud)
这有效地杀死了数据库中的所有集合,允许您每次都运行新的测试.
亚历克斯
另一种方法是使用database_cleaner.它支持多个ORM,所以我认为你可以这样做:
# 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
Run Code Online (Sandbox Code Playgroud)
没有办法让 MongoDB 变得非持久化。您只需在每次测试之前或之后删除数据即可。这里有一些关于此的文档:
http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing
归档时间: |
|
查看次数: |
5835 次 |
最近记录: |