如何通过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你知道如何让MongoDB在测试过程中不持久吗?(我甚至不能在沙箱模式下运行控制台,因为要使用Mongoid,我必须停用活动记录)。
发布于 2011-01-14 23:12:13
没有办法使MongoDB成为非持久性的。您只需在每次测试之前或之后删除数据。这里有一些关于这方面的文档:
http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing
发布于 2011-01-15 18:12:02
多亏了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对于Mongoid 3:
Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop这有效地杀死了db中的所有集合,允许您每次都以新的方式运行测试。
亚历克斯
发布于 2012-08-25 06:55:13
另一种方法是使用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
endhttps://stackoverflow.com/questions/4688140
复制相似问题