2

设置:

我的 Rail 3.2.12 应用程序使用 Rspec 和 FactoryGirl 来测试其大部分各种模型方法。

我使用 Postgres 进行生产、开发和测试。

问题:

一个模型 ZipCodes 有大约 40,000 行,包括经度/纬度数据,以及用于选择满足特定标准的记录的大量方法。

我需要根据真实数据测试这些方法。由于大小,每次我们运行测试时重新加载表太慢了。

问题:

如何通过终端或控制台或 rake 任务加载该静态 ZipCodes 表一次,然后不理会它,除非/直到数据更改(每隔几个月我们可能会添加一些邮政编码)。(另外,在每次测试运行后不要用 DatabaseCleaner 擦除它,尽管我在另一个问题中得到了答案,但我可以使用 :except => [tablename]。)

我现在有 CSV 和 YAML 格式的数据,但如果需要,可以将其移动到任何其他格式。

如果有某种方法可以将数据从开发数据库复制到测试数据库,我还将数据加载到我的开发数据库中。

(注意:我们不使用任何关联的主键,我们通过邮政编码或经度等其他字段进行所有查找,因此将数据加载到测试中的方法是否从我的开发数据库中引入主键并不重要)

4

1 回答 1

3

我建议您将 database_cleaner gem 用于您的测试套件https://github.com/bmabey/database_cleaner

然后您可以手动填充您的 ZipCodes 表,以便您准备好数据

诀窍是配置 database_cleaner 使 ZipCodes 表保持不变。为此,您需要在您的 spec_helper.rb 中进行设置DatabaseCleaner.strategy = :truncation, {:except => %w[zip_codes]}(假设您的策略是截断,并且您的表名是 zip_codes)

有关更多信息,请参阅 database_cleaner 文档(我的答案中的链接)

编辑

要回答关于填充数据库的第二个问题,您有多种选择。

您可以在测试环境之外应用这些技术(例如:在指定时从命令行运行种子RAILS_ENV=test)。这样做您将填充您的测试 DV,并且当您指定 database_cleaner 不清除此表时,它将保持不变。

请注意,每次运行迁移时,您都必须运行rake db:test:prepare以更新测试数据库结构,因此您必须再次运行此表中的数据导入。这仍然很方便,因为这样做可以节省测试场景之间的大量时间

于 2013-07-19T00:26:46.457 回答