我正在使用 Cucumber 来编写集成测试数据库清理器 https://github.com/bmabey/database_cleaner保持我的数据库干净。一切都很完美,因为我的测试不需要 JavaScript。
我可以使用最后的测试通过水豚网络套件 https://github.com/thoughtbot/capybara-webkit,但是我的数据库根本没有被清理。
这是我的功能/支持/env.rb file:
require 'simplecov'
SimpleCov.start 'rails'
require 'cucumber/rails'
Capybara.default_selector = :css
Capybara.javascript_driver = :webkit
begin
require 'database_cleaner'
require 'database_cleaner/cucumber'
DatabaseCleaner[:active_record].strategy = :transaction
rescue NameError
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end
Before do
DatabaseCleaner.start
end
After do |scenario|
DatabaseCleaner.clean
end
我尝试过类似的东西this http://rainux.github.io/2011/07/23/configure-capybara-webkit-to-run-acceptance-specs-with-javascript-ajax/检查水豚使用哪个驱动程序,但它不起作用。我还尝试了第三部分中提到的 hack这个帖子 http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/但后来一切都不起作用......
我真的不知道如何实现这一点,任何帮助将不胜感激。
提前致谢。
快速回答:
配置您的 JavaScript 测试以使用截断而不是事务:
DatabaseCleaner.strategy = :truncation
更长的解释:
事务策略不适用于 JavaScript 测试,因为大多数支持 JavaScript 的水豚驱动程序在与应用程序代码不同的线程中运行测试。
以下是该过程的基本概要:
- Capybara 在后台线程中使用 webrick 或 Thin 启动您的机架应用程序。
- 主线程设置驱动程序,提供机架应用程序运行的端口。
- 您的测试要求驱动程序与应用程序交互,这会导致伪造的 Web 浏览器对您的应用程序执行请求。
这是必要的,因为很难制作一个针对内存中 Rack 应用程序执行请求的假浏览器。在某些数据库驱动程序中,从多个线程对同一事务执行查询是不安全的。
最终结果是您需要在测试代码中提交事务,以便数据在应用程序代码中可见。解决此问题的最简单方法是使用截断数据库清理策略。
您可以配置 RSpec(或 Cucumber)以将事务用于除 JavaScript 测试之外的所有内容。这对于非 JavaScript 测试来说会更快,同时仍然适用于 JavaScript 测试。
Avdi Grimm 有一篇关于这个主题的很好的博客文章,详细描述了解决方案:http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/ http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)