1., 2. & 4., 如果您使用 capybara 的默认引擎 rack_test,您应该使用事务(使用 use_transactional_fixtures 或 database_cleaner gem 的事务支持)。正如您所指出的,使用事务比使用截断策略要快得多。但是,当数据库写入可以通过不同的线程(如 selenium)时,事务将不起作用。因此,您需要使用截断(或强制所有内容通过一个数据库线程 - 另一种选择)。
3. 是的,您应该在使用 database_cleaner gem 时关闭 use_transactional_fixtures,因为 gem 本身就支持事务。如果您只需要事务,那么只需使用_transactional_fixtures 并且永远不要加载 database_cleaner gem。
5. 以下代码将在:transaction 和:truncation 之间即时切换。 (用 rspec、capybara、rails3 对此进行了测试。)
功能这应该给你两全其美。 rack_test 的 速度 当您不需要测试 javascript 的东西时,selenium 的 灵活性 当您这样做时。
此代码还负责在需要时重新填充种子数据(此方法假定您使用 seed.rb 加载您的种子数据 - 这是当前的约定)。
将以下代码添加到 spec_helper。
config.use_transactional_fixtures = false
RSpec.configure do |config|
config.before(:suite) do
require "#{Rails.root}/db/seeds.rb"
end
config.before :each do
if Capybara.current_driver == :rack_test
DatabaseCleaner.strategy = :transaction
else
DatabaseCleaner.strategy = :truncation
end
DatabaseCleaner.start
end
config.after(:each) do
if Capybara.current_driver == :rack_test
DatabaseCleaner.clean
else
DatabaseCleaner.clean
load "#{Rails.root}/db/seeds.rb"
end
end
end
感谢Jo Liss 指路。
PS:如何即时切换驱动程序
上述解决方案假设您已经知道如何即时切换驱动程序。如果有些人不来这里,方法如下:
如上所述,假设您通常会使用默认的 capybara 驱动程序 rack_test,但需要使用 selenium 来测试一些 Ajaxy 的东西。当您想使用 selenium 驱动程序时,请分别将 :js => true 或 @javascript 用于 Rspec 或 cucumber。例如:
Rspec 示例:
describe "something Ajaxy", :js => true do
黄瓜例子:
@javascript
Scenario: do something Ajaxy