1

我通过 Cucumber 使用 Capybara 来测试 Rails 应用程序。

Rails 应用程序在 db/seeds.rb 中有一些种子数据,它设置了授权角色和默认用户帐户,并且我添加了一个 test_seed.rake 文件来在rake db:test:prepare运行后为测试数据库播种,因为rake db:seed没有播种测试数据库。

当我使用 Capybara 运行 Cucumber 功能时,这些种子数据将被单独保留,并且在测试每个功能时所做的任何更改都会回滚。

但是,如果我尝试测试基于 AJAX 的功能,通过将@javascript测试放在前面以便 Selenium 运行它,一旦测试完成,种子数据就会被删除。这意味着后续基于授权的测试rake db:test:prepare在再次运行之前会失败,因为它们在创建用户帐户时无法找到 role_id。

Selenium 为什么要这样做?更重要的是,我该如何阻止它?

(我知道我可以在每次测试之前使用 Cucumber hooks 加载数据。但是这些数据也需要在基于 RSpec 的单元测试之前加载。它还需要加载到开发和生产数据库中。所以使用内置的- in seed 机制似乎更 DRY。无论如何,数据库不应该因为 Selenium 被调用而以不同的方式回滚!)

编辑:我将 database_cleaner 与该:transaction策略一起使用。https://github.com/jnicklas/capybara上的文档提到了 database_cleaner,但似乎只是在谈论使用它:truncation来使其他一切工作方式与 Capybara 在调用外部浏览器时所做的事情相同。我没有尝试过那个页面上的补丁,因为我不喜欢“奇怪的失败”——有没有更干净的方法?我开始认为删除测试并只关注 AJAX 内容将是最快、最简单的方法……</p>

4

1 回答 1

0

我最终将 DatabaseCleaner.strategy 更改:truncation为 Cucumber 和 RSpec,并移至 SeedFu 为数据库播种。

对于黄瓜,将其添加到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

遗憾的是,这使得所有测试的运行速度都慢了一点,因为以前数据库只播种一次然后回滚,而不是每次都播种。即使种子文件中只有五个角色,也很明显。

于 2012-08-25T09:55:30.220 回答