Rspec中的数据库清理器策略

时间:2018-10-25 09:47:16

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

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

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

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作为功能。但是我已将数据库清理程序配置为对其他使用事务策略的功能类型示例使用截断策略。

数据库清除程序将使用哪种策略?截断或事务处理?

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

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

1 个答案:

答案 0 :(得分:1)

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

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