Rspec集成测试不清理数据库

时间:2011-04-09 21:58:40

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2

每次集成测试后都没有清理数据库。该值保留在数据库中。

我是否应该选择实现这一目标?

由于

6 个答案:

答案 0 :(得分:12)

我认为https://github.com/bmabey/database_cleaner就是您所需要的。

答案 1 :(得分:4)

对于使用before(:all)挂钩的任何人,请注意在打开与夹具关联的事务之前,执行这些挂钩。这意味着由before(:all)钩子创建的任何数据都不会被事务夹具回滚。您可以阅读更多in the RSpec documentation

我只是想提一下,因为我有点喜欢它,我最初的本能就是跳到数据库清理工具(最终不需要,最终无法工作)。

答案 2 :(得分:2)

在这里查看教程:http://railscasts.com/episodes/257-request-specs-and-capybara

它描述了除Rspec和Capybara之外的数据库清理程序

答案 3 :(得分:2)

您需要DatabaseCleaner,但您可能会发现:truncation策略有点太慢而无法一直运行。它实际上只是集成测试所必需的,所以你可以这样做:

# spec/spec_helper.rb
require 'database_cleaner'
config.before(:suite) do
  DatabaseCleaner.clean_with :truncation
  DatabaseCleaner.strategy = :transaction
end

config.before(:each) do |group|
  # The strategy needs to be set before we call DatabaseCleaner.start
  case group.example.metadata[:type]
  when :feature
    DatabaseCleaner.strategy = :truncation
  else
    DatabaseCleaner.strategy = :transaction
  end
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

# spec/features/your_feature_spec.rb
require 'spec_helper'
describe "An integration test", :type => :feature do
end

# spec/model/your_model_spec.rb
require 'spec_helper'
describe "A unit test" do
end

显然,这只适用于您直接使用RSpec进行集成测试而不是使用Cucumber进行集成测试。

答案 4 :(得分:2)

How do I prepare test database(s) for Rails rspec tests without running rake spec?

我的回答可能会让您感兴趣。这是一个很好的解决方案。对于您的情况,您可能需要类似

的内容
config.after :each do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

答案 5 :(得分:0)

有两种方法可以实现这一目标:

  1. 为每个单独的测试配置事务示例。
  2. 为所有测试配置事务示例。
  3. 如果您选择选项1:在spec文件的顶部,在:

    之后
    require 'spec_helper'
    

    添加:

    RSpec.configure {|c| c.use_transactional_examples = true }
    

    这将在每个示例之后回滚事务。

    2.如果要全局配置,则在spec_helper.rb

    RSpec.configure do |config|
    ...
    config.use_transactional_examples = true # Add this
    ...
    end