Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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 防止Rails测试删除种子数据_Ruby On Rails_Ruby_Testing_Fixtures_Seed - Fatal编程技术网

Ruby on rails 防止Rails测试删除种子数据

Ruby on rails 防止Rails测试删除种子数据,ruby-on-rails,ruby,testing,fixtures,seed,Ruby On Rails,Ruby,Testing,Fixtures,Seed,我正在使用seeds.rb填充一些状态模型参考数据: State.create :name => 'Alabama', :abbreviation => 'AL' State.create :name => 'Alaska', :abbreviation => 'AK' # ... 虽然我没有使用状态fixture(因为它首先是种子数据,我认为完全为了测试而复制它不会很枯燥),但是Rails测试框架似乎在测试期间删除了所有状态种子数据。(我正在删除、重新创建、迁移和重新

我正在使用seeds.rb填充一些状态模型参考数据:

State.create :name => 'Alabama', :abbreviation => 'AL'
State.create :name => 'Alaska', :abbreviation => 'AK'
# ...
虽然我没有使用状态fixture(因为它首先是种子数据,我认为完全为了测试而复制它不会很枯燥),但是Rails测试框架似乎在测试期间删除了所有状态种子数据。(我正在删除、重新创建、迁移和重新植入测试数据库,并在单元测试运行之前确认数据已存在。)

结果是此断言在seeds.rb中成功,但在单行测试中失败:

assert_equal 51, State.all.size

1) Failure:
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]:
<51> expected but was
<0>.
1 tests, 1 assertions, 1 failures, 0 errors
assert_等于51,State.all.size
1) 失败:
测试状态种子是否存在(状态测试)[/test/unit/state\u test.rb:24]:
预料之中,但事实并非如此
.
1个测试,1个断言,1个失败,0个错误
我尝试过在基本测试类fixtures语句中显式列出非状态模型,以及翻转事务fixtures标志(正如预期的那样,这只影响测试期间创建的记录)。当然,考虑中的测试本身并不是删除这些记录

状态记录总是被删除的。有没有办法告诉Rails不要插手种子数据?我是否需要复制Fixture中的所有数据以确保重新加载?如果没有重大政治事件,我预计国家数据将相对稳定


tia测试从数据库中删除所有数据,然后加载设备(如果有)

在测试运行之前,需要让测试助手加载种子文件。有两种方法可以做到这一点,请查看我的类似问题:

最简单的方法可能就是添加

需要“#{Rails.root}/db/seeds.rb”

到test_helper.rb文件的顶部(假设您使用内置测试框架)。

测试架构中未集成“种子”功能。测试是围绕装置构建的,每次运行测试套件时,Rails都会从装置加载数据并替换现有内容

然而,用种子数据填充数据库是非常简单的

在test_helper.rb文件中,在base
ActionSupport::TestCase
类中添加一个新的安装方法

class ActionSupport::TestCase < ...

  setup :load_seeds

  protected 

    def load_seeds
      load "#{Rails.root}/db/seeds.rb"
    end

end
class ActionSupport::TestCase<。。。
设置:加载\u种子
受保护的
def加载_种子
加载“#{Rails.root}/db/seeds.rb”
结束
结束

我同意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(或类似的),因为你提到你没有使用固定装置。确保从
test/test\u helper.rb
中删除
fixture: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
或其他与测试相关的任务时被提取出来

我也有同样的问题,但标准答案对我来说并不适用

我的问题涉及类文件中的位置,该类文件在数据库中查找常量和命名范围。我找不到任何方法在正确的时间加载种子数据

我确实找到了绕过删除的方法,尽管我已经删除了丢失表的fixture文件,但这种情况仍在发生

RAILS_ENV=测试rake db:seed
ruby-Itest test/units/*.rb

默认情况下,您不能同时应用
种子
夹具来设置相同的
表的数据

例如,如果您设置了一个名为
products.yml
的装置,它将在创建
fixtures
期间“从产品中删除数据”

你可以:

  • 种子
    的阶段移动到
    夹具
    后面(手动加载种子)
  • 仅使用其中一种方法,或使用另一种方法来管理测试数据
  • 不要使用这两种方法来设置同一个表的数据
  • 在Rails4.2中,您可以在
    test\u helper.rb
    像这样:
  • >


    这在一些遗留案例中会有所帮助,但混淆
    种子
    装置
    可能会带来新的问题。

    这将在每个测试用例之前重新加载种子数据,对于给定的事务装置,您可能不需要这样做。只要种子数据保持不变(它应该保持不变),就只需加载一次。这就是我所想的Luke,但不管怎样,它似乎都会被删除,因此,听起来我必须实施某种变通方法,以确保它存在于db for tests中。fixtures目录中有states.yml文件吗?即使它是空的,也会导致您的状态数据被删除。我总是确保删除种子数据表的fixture(实际上我不再真正使用fixture,但那是另一回事了)。是的,我确实有一个states.yml(空)。删除它(嗯,重命名它)是我尝试过的事情之一,但似乎没有帮助。但我会再给它一次机会,因为我仍然有兴趣看看我是否能阻止它甚至试图删除数据。嗨,帕特里克。实际上,我不需要测试状态模型本身,这只是一个示例,演示了种子数据
    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