DatabaseCleaner + RSpec:正确的配置是什么?

时间:2014-02-01 04:09:03

标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails database-cleaner

我在我的rails app中加入了database_cleaner gem。遵循git repo上给出的示例,并在spec_helper中包含以下代码:

方法1

  config.before(:suite) do
   DatabaseCleaner.strategy = :transaction
   DatabaseCleaner.clean_with(:truncation)
  end

  config.around(:each) do |example|
   DatabaseCleaner.cleaning do
    example.run
   end
  end

当我运行rspec时,我收到的错误为NoMethodError:undefined method 'cleaning' for DatabaseCleaner:Module

所以我做了一些研究,发现我可以用以下内容替换上面的config.around块:

方法2

config.before(:each) do
 DatabaseCleaner.start
end

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

OR

方法3

config.around(:each) do |example|
  DatabaseCleaner.start
  example.run
  DatabaseCleaner.clean
end

方法2和方法3都运作良好 我还查看了database_cleaner的git repo,发现cleaning方法确实存在并且使用以下代码:

def cleaning(&block)
     start
     yield
     clean
   end

这与我在示例3中所做的完全相同。如果确实存在,那么为什么它不可访问?我在这里错过了一些东西。还有更多设置? 或者是方法2或3更好?

3 个答案:

答案 0 :(得分:25)

终于找到了答案,

database_cleaner gem刚刚在上周添加了cleaning方法,并且还更新了相同的文档。但是这个更改不适用于我从rubygems.org采购的最新gem版本1.2.0。当我从Approach 1获取宝石时,github完美无缺,如下所示:

gem 'database_cleaner', git: 'git@github.com:DatabaseCleaner/database_cleaner.git'

答案 1 :(得分:1)

如果从Github中提取gem,可以使用文档中的方法

gem 'database_cleaner', git: 'git@github.com:bmabey/database_cleaner.git'

答案 2 :(得分:-1)

如果您使用mongoid遇到同样的问题,可以将其添加到Gemfile,更改版本以适合您,并运行bundle install。

gem 'database_cleaner', '~> 1.4.1'

然后在

中创建一个支持文件夹
spec/support/database_cleaner.rb

在spec_helper文件中需要database_cleaner.rb,我使用gem 'require_all',如下所示:

# spec/spec_helper.rb
require 'require_all'

require_rel 'support'

将以下清洁工具添加到database_cleaner.rb

RSpec.configure do |config|

  # Cleanup the DB in between test runs
  config.before(:suite) do
    DatabaseCleaner[:mongoid].strategy = :truncation
    DatabaseCleaner[:mongoid].clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

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

end

现在你的测试应该正确拆除。