Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道&x2B;Rspec—如何填充(并保持)一个包含40K个实记录(zipcodes)的静态表来运行测试_Ruby On Rails_Database_Rspec - Fatal编程技术网

Ruby on rails 轨道&x2B;Rspec—如何填充(并保持)一个包含40K个实记录(zipcodes)的静态表来运行测试

Ruby on rails 轨道&x2B;Rspec—如何填充(并保持)一个包含40K个实记录(zipcodes)的静态表来运行测试,ruby-on-rails,database,rspec,Ruby On Rails,Database,Rspec,设置: My Rail 3.2.12应用程序使用Rspec和FactoryGirl测试其大多数模型方法 我使用Postgres进行生产、开发和测试 问题: 其中一个模型ZipCodes有大约40000行,包括经度/纬度数据,以及许多选择符合特定标准的记录的方法 我需要用真实世界的数据来测试这些方法。由于大小的原因,每次运行测试时重新加载表的速度太慢 问题: 如何通过终端、控制台或rake任务加载静态ZipCodes表一次,然后在数据更改之前(每隔几个月我们可能会添加几个ZipCodes)不加载它

设置:

My Rail 3.2.12应用程序使用Rspec和FactoryGirl测试其大多数模型方法

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

问题:

其中一个模型ZipCodes有大约40000行,包括经度/纬度数据,以及许多选择符合特定标准的记录的方法

我需要用真实世界的数据来测试这些方法。由于大小的原因,每次运行测试时重新加载表的速度太慢

问题:

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

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

我还将数据加载到我的开发数据库中,如果有办法将其从开发人员复制到测试数据库中的话


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

我建议您使用数据库作为测试套件

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

诀窍是配置数据库清理器,使ZipCodes表保持不变。为此,您需要在spec_helper.rb
DatabaseCleaner.strategy=:truncation,{:except=>%w[zip_code]}
(假设您的策略是truncation,并且您的表名是zip_code)

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

编辑

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

  • 您可以使用seed.db查看此答案(其中还包含指向有趣railscast的链接)

  • 您可以在此处使用populator gem(我认为这是最方便的)所有信息:

  • 您可以在rails环境之外执行的任何其他操作(例如:在Postgres manager中导入SQL)

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


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

谢谢,尽管这是我知道如何做的部分(我现在使用database_cleaner)。我所不知道的是如何将数据加载到测试数据库并保留在那里,从dev数据库、yaml或csv。这是基本的SQL。正如我在回答中所说,您可以手动填充DB(通过postgres manager应用程序导入数据)//或者如果您真的需要留在Rails中,您可以使用seed.rb并运行
rake DB:seed Rails\u ENV=test
,它可能是基本SQL,也可能与seed.DB或fixture有关,或者与某种DB转储/加载有关,或使用一次性模型规范通过csv导入。我没有加载静态数据的经验,也不知道哪种方法最有效,因此我提出了这个问题。(例如,我可以让fixture工作,它们非常慢,所以可能有一种方法可以通过fixture加载一次。)