【问题标题】:DatabaseCleaner + RSpec : what is the correct configuration?DatabaseCleaner + RSpec:正确的配置是什么?
【发布时间】:2014-02-24 23:14:15
【问题描述】:

我在我的 rails 应用程序中加入了 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 块:

方法二

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

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

方法 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 更可取?

【问题讨论】:

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


    【解决方案1】:

    终于找到答案了,

    database_cleaner gem 上周刚刚添加了cleaning 方法,并更新了相同的文档。但我从 ruby​​gems.org 获取的最新 gem 版本 1.2.0 中没有此更改。当我从 github 获取 gem 时,Approach 1 完美运行,如下所示:

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

    【讨论】:

      【解决方案2】:

      如果你从 Github 拉出 gem,你可以使用文档中的方法

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

      【讨论】:

      • 这就是我为它工作所做的。检查我上面的答案。
      • 我知道。刚刚为懒惰的人提取了实际的 Gemfile 条目;)
      【解决方案3】:

      如果您在使用 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
      

      您的测试现在应该可以正常结束了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        相关资源
        最近更新 更多