Rails,成为朋友并在测试套件之间重置数据库

Var*_*rac 11 ruby-on-rails ruby-on-rails-3

工作正在从Rails 3过渡到Rails 4.在开发方面,一切似乎都或多或少地顺利运行,但是当所有套件 - 单元,功能和集成 - 一次性运行时,测试会导致各种各样的失败.rake:test.

有趣的是,单独运行每个套件都不会产生任何故障.这有力地表明数据库没有像Rails 3那样重置我们在Rails 4中的测试.

我已经尝试覆盖rake:db:test:prepare在运行每个套件之前执行测试任务,但这显然没有做我认为它做的,或者更确切地说,我想要它做什么,这是使用一套新的每个测试的数据,因此独立于其他测试成功或失败 - 在我们的Rails 3设置中它(已经或应该是)的方式.

为什么会这样?我该怎么办呢?

(请注意,测试框架是带有夹具等的vanilla Rails.我们得到的测试失败通常是外键错误或数据以预期方式更改的失败,在测试之前重置DB时不会显示套房.)

编辑:

以下是我对Rakefile所做的更改.我们的想法是获得rake:test,就像在Rails 3中一样,除了在单元,功能和集成套件之间正确地重置数据库.

# /Rakefile

task :test => [];
Rake::Task[:test].clear
task :test do
    puts Rails.env
    if Rails.env == "test"
        puts "units"
        # Rake::Task["db:drop"].execute - results in 'test database not configured' error
        # Rake::Task["db:reset"].execute - results in 'relation 'table' does not exist' error
        Rake::Task["db:create"].execute
        Rake::Task["db:migrate"].execute
        Rake::Task["test:units"].execute
        puts "functionals"
        Rake::Task["db:schema:load"].execute
        Rake::Task["test:functionals"].execute
        puts "integration"
        Rake::Task["db:schema:load"].execute
        Rake::Task["test:integration"].execute
    end
end
Run Code Online (Sandbox Code Playgroud)

编辑2:

Rails版本4.1.8

这是我的test_helper.我省略了不能使用我们数据的辅助方法,因为我可能不允许共享它们,并且它们与测试数据库的加载方式无关.

另请注意,我们还有一个自定义schema.rb,从中生成测试数据,因为尝试从迁移创建它们不支持我们在最终产品中需要的一些自定义功能/行为,例如物化视图.编辑后的内容将包含在<< >>中.

#test_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
include ActionDispatch::TestProcess

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting
  set_fixture_class <<cached_object>>: ResultsDb::<<DesiredObjectClass>>Cache
  fixtures :all

  # Add more helper methods to be used by all tests here...
  def reload_contig(contig_sym)
    contig = contigs(contig_sym)

    src = contig.src
    new_tig = Contig.new(
              org: contig.org,
              version: contig.version,
              size: contig.size,
              sha1: contig.sha1,
              active: contig.active,
              src_id: src.id,
              src_type: contig.src_type)

    new_tig.id = contig.id
    contig.destroy
    unless new_tig.save
      raise new_tig.errors.full_messages.inspect
    end
    src.contigs << new_tig
    src.save
    new_tig
  end

  def reload_coord(coord_sym)
      coord = coords(coord_sym)

      new_coord = Coord.new(
          :mapped_id => coord.mapped_id,
          :mapped_type => coord.mapped_type,
          :contig_id => coord.contig_id,
          :contig_type => coord.contig_type,
          :start => coord.start,
          :stop => coord.stop,
          :fwd_strand => coord.fwd_strand
      )
      new_coord.id = coord.id
      coord.destroy
      new_coord.save!
  end
end
Run Code Online (Sandbox Code Playgroud)

cre*_*son 0

您是否尝试过在您的重写中添加其中任何一个rake:test

rake db:reset db:migrate
Run Code Online (Sandbox Code Playgroud)

或者

rake db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)

这个问题似乎与this类似。我知道我总是构建自己的rake db:recreate测试数据来执行此类操作。