在Cucumber测试中调用@javascript后会丢失种子数据

时间:2012-08-14 12:01:14

标签: selenium cucumber capybara

我正在通过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的东西将是最快捷,最简单的方式......

1 个答案:

答案 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

可悲的是,这使得所有测试的运行速度稍慢,因为之前数据库只播种一次然后回滚,而不是每次播种。即使在种子文件中只有五个角色,它也是显而易见的。