我们有大量的非用户数据:500种产品类型在20年内没有变化,200GB的地理空间数据从未改变(皇后区总是40.73N / 73.82W)......等等它们是一样的在发展和生产。它在测试中应该是相同的,但在测试期间Rails会清空测试表的所有,并且在测试期间重新填充需要花费大量时间。
对这些非用户数据进行分区的Rails方法是什么,以便不必在Test中重新填充?
答案 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足够轻,以便快速加载。
您的测试装置应与您的应用程序引导数据分开,利用它。
真实真实答案
请勿在测试中触摸数据库(或触摸它很少)。数据库很慢,固定装置很难或不可能很好地维护。相反,请尝试使用存根框架,例如Mocha或flexmock。它更快,并使您的测试以更清晰的方式读取。测试是针对代码的,您可以将数据库存根,并相信ActiveRecord可以工作(因为......它也经过了测试!: - )。
如果你选择坚持使用灯具,我建议使用factory_girl而不是内置的Rails灯具。你会有一个更好的起点。