DatabaseCleaner + RSpec:正确的配置是啥?

Posted

技术标签:

【中文标题】DatabaseCleaner + RSpec:正确的配置是啥?【英文标题】: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 更可取?

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于DatabaseCleaner + RSpec:正确的配置是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SystemStackError - 堆栈级别太深;在 Rspec 测试中,使用acts_as_audited、Rspec、数据库清理器

Rails RSpec 测试 has_many :through 关系

我无法使用 'bundle exec rspec' 执行 rspec

是否有RSpec等效的RSpec来做TDD?

ruby [rspec]“使用RSpec测试Rails程序”笔记

RSpec vs Cucumber(RSpec 故事)[关闭]