我在哪里将数据库查询测试放在rails中?

ege*_*ari 7 ruby database testing model ruby-on-rails

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

现在,我一直把我的模型方法和验证测试放在主模型规范中.这个文件已经很大了.

测试查询的"标准"位置在哪里?我可以想象自己制作了大量的灯具/虚拟数据,以确保我的查询按预期工作(可能是一个更好的主意,因为我刚开始使用rails).基本模型逻辑和验证测试并不需要这些.

如果你可以提供一些建议来测试这些测试的位置,使用rails测试查询的最佳方法(特别是有多个连接的测试!),以及可能与DBunit/spring/hibernate不同的一些基本指导原则,那太好了.

谢谢!

oma*_*oma 4

我也曾经使用 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
Run Code Online (Sandbox Code Playgroud)

并且您可能有子目录,自动被 rspec 拾取,例如spec/models/account/..

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

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

编辑:添加我的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
Run Code Online (Sandbox Code Playgroud)

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

  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
Run Code Online (Sandbox Code Playgroud)