我以前也用过hibernate。 ActiveRecord的方式与hibernate非常不同。你需要放下心灵,无论好坏。在java和Hibernate中,你经常拥有聚合根和对象图。通常情况下,对象图和代码库在某种程度上都比较小。我不知道你的具体情况,所以我会小心翼翼地行事,但我警告你要尝试适合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 spec
或rspec 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
这样我可以启用/每规格后禁用autocleanup设置(每个“它”) 。
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
来源
2011-05-09 21:39:50
oma
不确定“查询”是什么意思。在Rails中,最好将数据库视为持久对象的地方。 ActiveRecord对象更加精确。 ORM负责所有的数据库逻辑和SQL。那些不需要被测试,除非你正在做一些违反公约的事情。 – 2011-05-04 14:29:26
@Mike Farmer如果您在请求特定值之前走过对象图20次,ActiveRecord会在20个表之间创建一个复杂而有效的SQL连接? – egervari 2011-05-09 20:37:43
只要你正确地设置你的关联,我真的不明白为什么不。来自数据库背景,但我明白你的观点。编写测试以确保您的查询构建正确并具有高性能是您指定的复杂性的好主意。为您的关联修改一些finder_sql,counter_sql,delete_sql和insert_sql对于更复杂的查询也可能会有所帮助。请参阅(http://j.mp/lOSBkh) – 2011-05-12 16:55:13