首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MongoDB和Mongoid在Rails3上进行适当的数据库测试

如何使用MongoDB和Mongoid在Rails3上进行适当的数据库测试
EN

Stack Overflow用户
提问于 2011-01-14 13:04:02
回答 5查看 6.1K关注 0票数 19

如何通过Mongoid on Rails使用MongoDB编写适当的单元测试(以及集成测试)?

我之所以这样问,是因为与使用SQLite3相反,即使在运行测试时,我所做的一切都会持续下去。因此,目前我正在编写创建测试,然后手动删除我所做的一切。但是集成测试变得越来越烦人,甚至变得很复杂。

我所做的示例:

代码语言:javascript
复制
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,我必须停用活动记录)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-14 23:12:13

没有办法使MongoDB成为非持久性的。您只需在每次测试之前或之后删除数据。这里有一些关于这方面的文档:

http://www.mongodb.org/display/DOCS/Rails+-+Getting+Started#Rails-GettingStarted-Testing

票数 4
EN

Stack Overflow用户

发布于 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中添加一个块:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 Mongoid.default_session.collections.select {|c| c.name !~ /system/ }.each(&:drop

这有效地杀死了db中的所有集合,允许您每次都以新的方式运行测试。

亚历克斯

票数 12
EN

Stack Overflow用户

发布于 2012-08-25 06:55:13

另一种方法是使用database_cleaner。它支持多个ORM,所以我认为你可以这样做:

代码语言:javascript
复制
# 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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4688140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档