在Rails测试中处理非用户数据

时间:2009-08-17 17:31:18

标签: ruby-on-rails testing

我们有大量的非用户数据:500种产品类型在20年内没有变化,200GB的地理空间数据从未改变(皇后区总是40.73N / 73.82W)......等等它们是一样的在发展和生产。它在测试中应该是相同的,但在测试期间Rails会清空测试表的所有,并且在测试期间重新填充需要花费大量时间。

对这些非用户数据进行分区的Rails方法是什么,以便不必在Test中重新填充?

2 个答案:

答案 0 :(得分:1)

此文档可在Fixtures class.中找到(在该页面上搜索“交易固定装置”。)

他们给出的例子开头是这样的:

class FooTest < ActiveSupport::TestCase
    self.use_transactional_fixtures = true
    self.use_instantiated_fixtures = false
    ...

我工作的其中一个项目使用的测试数据库为零,因此我们只需在test_helper.rb中全局定义。

class ActiveSupport::TestCase
  self.use_transactional_fixtures = true
  self.use_instantiated_fixtures  = false
end

答案 1 :(得分:1)

jdl显示了用于启用和禁用transactional_fixtures的设置,您应该能够设置:

# Use self in ActiveSupport::TestCase if you don't have a config block
# in test/test_helper.rb
#
config.use_transactional_fixtures = false

并且在每次测试运行之前阻止Rails尝试加载灯具。缺点是您不能假设所有灯具都装入数据库。

真实答案

您的灯具中有太多数据。 Railsy要做的事情是在测试装置中加载仅需要的数据;你不需要200G的地理空间数据(无论如何,那个怪异的数据集听起来太大了),你可能不需要所有500种产品。

测试适用于您的代码,因此仅包含测试所需的少数地理空间点,或仅包含一些具有唯一属性的产品。保持DB足够轻,以便快速加载。

您的测试装置应与您的应用程序引导数据分开,利用它。

真实真实答案

请勿在测试中触摸数据库(或触摸它很少)。数据库很慢,固定装置很难或不可能很好地维护。相反,请尝试使用存根框架,例如Mochaflexmock。它更快,并使您的测试以更清晰的方式读取。测试是针对代码的,您可以将数据库存根,并相信ActiveRecord可以工作(因为......它也经过了测试!: - )。

如果你选择坚持使用灯具,我建议使用factory_girl而不是内置的Rails灯具。你会有一个更好的起点。