我正在通过Cucumber使用Capybara来测试Rails应用程序。
Rails应用程序在db / seeds.rb中有一些种子数据,用于设置授权角色和默认用户帐户,我在rake db:test:prepare
之后添加了一个test_seed.rake文件来为测试数据库设定种子。运行,因为rake db:seed
不会为测试数据库设定种子。
当我使用Capybara运行Cucumber功能时,此种子数据将保持不变,并且在测试每个功能时所做的任何更改都将被回滚。
但是,如果我尝试测试基于AJAX的功能,通过将@javascript
放在测试前面以便Selenium运行它,一旦测试完成,就会删除种子数据。这意味着在rake db:test:prepare
再次运行之前,基于授权的后续测试将失败,因为他们在创建用户帐户时无法找到role_id。
为什么Selenium这样做?更重要的是,我怎么能阻止它?
(我知道我可以在每次测试之前使用Cucumber钩子来加载数据。但是这些数据也需要在基于RSpec的单元测试之前加载。它还需要加载到开发和生产数据库中。所以使用内置的种子机制似乎更干。在任何情况下,数据库不应该因为调用Selenium而不同地回滚!)
编辑:我正在使用带有:transaction
策略的database_cleaner。 https://github.com/jnicklas/capybara上的文档提到了database_cleaner,但似乎只是在与:truncation
一起使用它来使其他所有内容与Capybara在调用外部浏览器时的工作方式相同。我没有尝试过该页面上的补丁,因为我不喜欢“奇怪的失败” - 有更清洁的方式吗?我开始认为删除测试并只关注AJAX的东西将是最快捷,最简单的方式......
答案 0 :(得分:0)
我最终将Cucumber和RSpec的DatabaseCleaner.strategy更改为:truncation
,然后转移到SeedFu以播种数据库。
对于Cucumber,请将其添加到env.rb
:
Before do
SeedFu.quiet = true
SeedFu.seed
end
(记得改变DatabaseCleaner.strategy!)
对于RSpec,将其添加到spec_helper.rb
:
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
SeedFu.quiet = true
SeedFu.seed
end
config.after(:each) do
DatabaseCleaner.clean
end
可悲的是,这使得所有测试的运行速度稍慢,因为之前数据库只播种一次然后回滚,而不是每次播种。即使在种子文件中只有五个角色,它也是显而易见的。