代码之家  ›  专栏  ›  技术社区  ›  BrunoF

Rails&RSpec:使用预先存在的记录测试数据库

  •  1
  • BrunoF  · 技术社区  · 7 年前

    sql 所有开发人员必须在其本地测试环境中导入的文件。在持续集成服务器中导入相同的数据库。我觉得对测试数据的控制越少,测试过程就越困难。

    在某些测试中,有没有办法忽略测试数据库的内容(模拟一个空数据库并创建自己的测试数据,而不实际删除测试数据库中的所有行)?可能有两个数据库(都在同一个MySQL服务器中),并且能够在它们之间切换(例如,一些测试使用一个数据库,其他测试使用另一个数据库)?

    关于如何应对这种情况,还有其他建议吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   seanriordan08    7 年前

    我建议将您的test_数据库和“test”环境保留为“干净”状态。然后,您可以设置一个单独的数据库,最初将其作为“脏”数据库种子。您的rails\u助手文件中的before钩子也可以这样设置:

    RSpec.configure do |config|
      config.before :each, type: :feature do |example|
        if ENV['TEST_DIRTY'] || example.metadata[:test_dirty]
          ActiveRecord::Base.establish_connection(
            {
              :adapter => 'mysql2',
              :database => 'test_dirty',
              :host => '127.0.0.1',
              :username => 'root',
              :password => 'password'
            }
          )
        end
      end
    end
    

        2
  •  1
  •   BrunoF    7 年前

    我发现将以下配置添加到 spec/rails_helper.rb 将在测试或 before(:each) 块作为事务,在每个测试完成后回滚。这意味着我们可以做类似的事情 before(:each) { MyModel.delete_all } ,创建我们自己的测试数据,运行我们的断言(只会看到我们创建的数据),测试结束后,所有先前存在的数据仍将在数据库中,因为删除将回滚。

    RSpec.configure do |config|
      config.use_transactional_fixtures = true
    end