阻止Rails测试删除种子数据
我使用seeds.rb来填充一些状态模型参考数据:
State.create :name => 'Alabama', :abbreviation => 'AL' State.create :name => 'Alaska', :abbreviation => 'AK' # ...
虽然我没有使用状态装置(因为它的种子数据开始,我认为不必为了测试而必须复制它),Rails测试框架似乎在测试期间删除了所有状态种子数据。 (我正在删除,重新创建,迁移和重新安装测试数据库,并在unit testing运行之前确认数据存在。)
结果是这个断言在seeds.rb中成功但在一行测试中失败:
assert_equal 51, State.all.size 1) Failure: test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]: expected but was . 1 tests, 1 assertions, 1 failures, 0 errors
我已经尝试在基本测试类fixtures语句中明确列出非状态模型,以及翻转事务fixtures标志(正如预期的那样,这只会影响测试期间创建的记录)。 当然,正在考虑的测试本身并不删除这些记录。
始终删除州记录。 有没有办法告诉Rails只是脱掉种子数据? 我是否需要复制灯具中的所有数据以确保它重新加载? 如果没有重大政治事件,我预计州的数据会相对稳定。
TIA
测试从数据库中删除所有数据,然后加载你的灯具(如果有的话)。
在测试运行之前,您需要让测试助手加载种子文件。 有几种方法可以做到这一点,看看我的类似问题: 如何自动将db:seed数据加载到测试数据库中?
最简单的方法可能只是添加
require "#{Rails.root}/db/seeds.rb"
到test_helper.rb文件的顶部(假设您使用内置测试框架)。
“种子”function未集成到测试体系结构中。 测试是围绕灯具构建的,每次运行测试套件时,Rails都会加载灯具中的数据并替换现有内容。
但是,使用种子数据填充数据库非常简单。
在test_helper.rb文件中,在基本ActionSupport::TestCase
类中添加一个新的安装方法。
class ActionSupport::TestCase < ... setup :load_seeds protected def load_seeds load "#{Rails.root}/db/seeds.rb" end end
我同意weppos关于这样做的最佳方式,但是为了完整性并且为了那些可能已经拥有夹具文件的人,你可以采用其他方法并从现有的夹具中种植数据库。
这可以通过在db / seeds.rb文件中执行以下操作来完成
RAILS_FIXTURES = "#{Rails.root}/spec/fixtures" models_loaded_from_fixtures = %w[Modela Modelb Modelc ....] models_loaded_from_fixtures.each do |model| Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}") puts "Loaded #{model.constantize.all.size} #{model.pluralize}" end
您也可以阅读fixures目录并创建一个要处理的文件名数组,我选择了上面的过程,因为我希望能够指定我希望为DB提供种子的许多现有灯具中的哪一个。
我怀疑是否需要首先编写类似的测试。 您是否正在测试种子数据rake任务是否正常工作,或者您是否要测试State类实现的行为? 我假设后者,所以我会编写专注于行为的测试并使用Factory Girl(或类似的),因为你提到你没有使用灯具。 确保删除了fixtures :all
test/test_helper.rb
fixtures :all
行。
要将任务注入正常的运行测试流程,这种方法一直对我有用:
namespace :test do task :force_environment do ENV['RAILS_ENV'] = 'test' RAILS_ENV.replace('test') end end %w(test:units test:functionals test:integration).map do |task_name| task = Rake::Task[task_name] task.clear_prerequisites task.enhance %w(db:test:prepare test:force_environment db:seed) end
只需将其放在名为lib/tasks/testing.rake
的文件中,当您下次运行rake test
或其他与测试相关的任务时,它将被拾取。
我有同样的问题,但标准答案对我不起作用。
我的问题涉及到类文件,它们对常量和named_scopes进行数据库查找。 我找不到任何方法在正确的时间加载种子数据。
我确实找到了绕过删除的方法,即使我删除了缺失表的fixture文件,也发生了删除。
RAILS_ENV =测试rake db:种子ruby -Itest test / units / * .rb
默认情况下,您不能同时应用seed
和fixtures
来设置相同的table
数据。
例如。 如果您设置名为products.yml
的灯具,它将在创建fixtures
期间“从产品中删除数据”。
您可以:
- 将
seed
的舞台移到fixtures
后面(手动装载种子); - 只使用其中一种或另一种方法来管理测试数据;
- 不要同时使用这两种方法来设置相同的表格数据;
- 在Rails4.2中,您可以在
test_helper.rb
破解此行 ,如下所示:
>
require 'rails/test_help' class ActiveRecord::FixtureSet def self.create_fixtures(fixtures_directory, fixture_set_names, class_names = {}, config = ActiveRecord::Base) ... # table_rows.each_key do |table| # conn.delete "DELETE FROM #{conn.quote_table_name(table)}", 'Fixture Delete' # end ... end
这将有助于一些传统的案例,但弄乱seeds
和fixtures
可能会带来新的问题。