【问题标题】:Database cleaner strategy in RspecRspec 中的数据库清理策略
【发布时间】:2018-10-25 09:47:16
【问题描述】:

是否可以在测试用例的任何时候检查数据库清理策略是什么?

我如何知道测试用例中使用了哪种类型的策略?

config.before(:example) do
  DatabaseCleaner.strategy = :transaction
end

config.before(:example, type: :feature, js: true) do
  DatabaseCleaner.strategy = :truncation
end

require 'rails_helper'
RSpec.feature 'Login Feature', type: :feature do
  it 'invalid user login fail' do
    a = create(:normal_user, role: AdminType::OWNER)
    visit('/')
  end
end

在这里,我在最顶部的describe 块(示例组)中提到了类型作为功能,而不是在示例中。但是我已经将我的数据库清理器配置为对使用事务策略的其他人的特征类型示例使用截断策略。

数据库清理器将使用哪种类型的策略,截断或事务?

如果它使用截断策略,那么我认为type: feature 下的所有示例都将被视为type: feature 示例。我说的对吗?

我将如何检查当前的策略是什么(例如,通过查看测试日志)?

【问题讨论】:

  • 为什么需要知道?您的测试是否依赖于一种特定的策略?又失败了?为什么?我认为无论您如何设置数据库,您的测试都应该始终通过。
  • @spickermann 如果有办法,我想知道/确认它是否根据我的数据库清理器配置使用了正确的 startgey。 .so 标记为 type:feature 的示例组下的所有示例都将被视为 type:feature 示例??
  • RSpec.featuure 已经添加了 type: feature 元数据,因此您无需再次指定它。另外,您使用的是什么版本的 Rails? (Rails 5.1 及以上版本一般不需要DatabaseCleaner)
  • 哦,太好了。感谢您提供的信息。 @ThomasWalpole 我正在使用 Rails 5.0.2。所以 Rspec.feature 块下的所有示例都将被视为特征类型示例?换句话说,Rspec.feature 块下的所有示例都将具有类型:特征元数据?使用系统规范而不是功能规范有什么优势??。如果我使用 Rails 自定义系统测试用例 5.1 或更高版本,我只需要在测试用例中使用 minitest 语法??
  • 还有一个疑问,在 Rails 5.1 或更高版本中,如果我想将 rspec 与系统规范一起使用,那么我是否需要数据库清洁器 gem? @ThomasWalpole

标签: ruby-on-rails ruby capybara rspec-rails


【解决方案1】:

是的 - RSpec.feature 块内的任何测试都将具有 tpye: :feature 元数据,除非它通过指定另一种类型来覆盖。系统规格和功能规格基本上是一回事,只是 Rails 在系统测试上增加了一层抽象(driven_by 等)

在 Rails 5.1+ 的功能或系统测试中,即使使用 RSpecs 系统测试而不是基于 Rails minitest 的系统测试,通常也不需要 DatabaseCleaner。这是因为 Rails 5.1 在测试环境中添加了测试进程中所有线程之间数据库连接的自动共享。如果您在测试期间需要一个单独的进程来访问数据库,那么您仍然需要 DatabaseCleaner,但这并不常见,尤其是对于刚开始的项目。

【讨论】:

  • 非常感谢..我有最后一个疑问。正如您所说,通常我们不需要数据库清理器,直到在测试期间单独的进程尝试访问数据库。如果是系统/功能测试套装对于使用 Devise gem 登录,我是否需要数据库清洁器 gem。请参阅下面的代码
  • require 'rails_helper' RSpec.feature 'Login Feature', type: :feature do let(:user) { create(:normal_user, role: AdminType::OWNER) } it '有效的用户登录和log out' do visit('/') within('#new_user') do fill_in 'user[email]', with: user.email fill_in 'user[password]', with: user.password end click_button 'SIGN IN' expect(page).to have_content(user.name.present? ? user.name : user.email) end end
  • 在这个中,如果我运行它,它会失败。在这里,我正在访问根页面,然后在 UI 中创建使用并填写用户详细信息,然后单击登录按钮在设计 gem 进行身份验证期间,我创建的用户成为未经授权的用户。我想知道原因是是因为用户创建是在单独的过程中并且设计身份验证是在单独的过程中还是任何其他原因?如果有,请告诉我
  • @Jegan 很抱歉,我不明白你在问什么,这似乎与当前问题无关。停止尝试扩展当前问题,而是创建一个新问题(如果有的话),提供足够的信息让人们能够回答 - 在 cmets 中粘贴多行代码基本上是不可读的。