>我应该使用use_transactional_fixtures还是使用database_cleaner gem?
哪个database_cleaner策略是最好的?我注意到迁移后:截断到:事务我的800多个例子运行速度快了4倍!
>当我使用database_cleaner:transaction时应该关闭use_transactional_fixture?
>对于rack_test来说最好的策略是:事务是真的吗?
>从“交易”到“更改战略”的最佳做法是什么?使用硒或akephalos时截断?
附: MysqL,Rails 3,Rspec2,Cucumber
P.P.S.我知道spork和parallel_test并使用它们.但他们是偏执的.例如,Spork在整个套件运行时保存大约15-20秒,但是从:事务更改为:截断大大增加了运行时间从3.5分钟到13.5分钟(10分钟差异).
解决方法
是的,您应该在使用database_cleaner gem时关闭use_transactional_fixtures,因为gem本身支持事务.如果只需要事务,那么只需使用_transactional_fixtures,从不加载database_cleaner gem.
5.以下代码将在之间切换:事务和截断. (用rspec,capybara,rails3测试)
特点这应该给你最好的两个世界.当您不需要测试JavaScript内容时,rack_test的速度和硒的灵活性.
此外,此代码在需要重新填充种子数据的情况下负责重新填充种子数据(此方法假定您使用seed.rb加载种子数据 – 与当前约定一样).
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 =>对于Rspec或黄瓜,分别为true或@javascript.例如:
Rspec示例:
describe "something Ajaxy",:js => true do
黄瓜例子:
@javascript Scenario: do something Ajaxy