我通过 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>