ruby-on-rails - 我应该将我的数据库查询测试放在 Rails 中的什么位置?

标签 ruby-on-rails ruby database testing model

我来自 Spring/hibernate 背景。我注意到 Rails 没有 dao 和服务层。这确实加快了开发速度,但有时我不知道将测试放在哪里。

现在,我一直在将我的模型方法和验证测试放在主要模型规范中。这个文件已经相当大了。

测试查询的“标准”位置在哪里?我可以想象自己制作了大量固定装置/虚拟数据以确保我的查询按预期工作(可能是一个更好的主意,因为我是 Rails 的新手)。这些对于基本模型逻辑和验证测试来说并不是真正需要的。

如果您能提供一些关于将这些测试放在哪里的建议,使用 rails 测试查询的最佳方法(尤其是具有多个连接的查询!),也许还有一些基本准则,说明它与使用 DBunit/spring 进行测试有何不同/hibernate,那太好了。

谢谢!

最佳答案

我以前也用过hibernate。 ActiveRecord 方式与 hibernate 有很大不同。你需要让你的思想自由,不管是好是坏。在 Java 和 Hibernate 中,你通常有聚合根和对象图。通常,对象图和代码库在 ruby​​ 中也以某种方式较小。我不知道你的具体情况,所以我会谨慎行事,但我警告你尝试让 ruby​​ 和 rails 适应你的 java 习惯。

您可以将自定义目录与 rspec 一起使用,以对您和您的团队有意义的方式进行组织。

#spec/queries/my_custom_search_spec.rb

require 'spec_helper'
describe MyModel do
  it "should do this query and return X" do
     subject.some_defined_scope_search.should == "something"
  end
end

你可能有子目录,由 rspec 自动获取,比如 spec/models/account/..

rake specrspec spec 将自动选取该规范。我只是在上面写了一个简单的例子,因为我不知道你的情况。您是用查询定义范围,还是定义专门的方法?

我强烈建议放弃固定装置(与插入相同 - 对我来说是反模式)以获得更可重构的东西,例如工厂。我喜欢factory_girl .它让您的应用程序以更敏捷的方式发展,IMO。

编辑: 在我的 spec_helper.rb 中添加启用/禁用自动清理的设置

RSpec.configure do |config|
  require 'database_cleaner'
  config.add_setting :skip_database_clean
  config.skip_database_clean = false
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
  end

  config.after(:each) do
    MongoMapper.database.collections.each(&:remove)
    DatabaseCleaner.clean unless config.skip_database_clean
  end

我添加了变量 skip_database_clean 以便我可以在每个规范(每个“它”)之后启用/禁用自动清理。

  before :all do
    @an_object = some_expensive_test_buildup
    RSpec.configuration.skip_database_clean = true
  end
  after :all do
    RSpec.configuration.skip_database_clean = false
    DatabaseCleaner.clean
  end

关于ruby-on-rails - 我应该将我的数据库查询测试放在 Rails 中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5862786/

相关文章:

jquery - 为什么在 Ruby on Rails 中没有使用 jQuery AJAX 执行 respond_to js?

ruby-on-rails - Ruby on Rails 分页 : Sort order not respected (will_paginate gem)

ruby - rvm 安装不工作 : "RVM is not a function"

ruby - 在不使用 BigDecimal 的情况下将美分转换为 Ruby 中的美元字符串

database - 在哪里存储密码盐以及如何获取它

php - 为什么我无法获取文件路径并写入数据库?

ruby-on-rails - 根据用户是否在没有 Devise on Ruby on Rails 的情况下登录来更改 root

javascript - Rails 3.2.2 不执行 rjs

sql - Postgres : Is there a way to tie a User to a Schema?

ruby-on-rails - Rails 事件记录 : foreign_key vs references