我用黄瓜给我写集成测试, 数据库清理 ,以保持我的分贝干净。 一切都完美的作品作为我的测试并不需要Javascript。
我可以让这最后的测试通过使用水豚webkit的 ,但后来我的数据库是未清除的。
这里是我的功能/支持/ env.rb文件:
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
我想类似的东西这个检查是哪个驱动程序所使用的水豚,但没有奏效。 我也试过在第三部分中提到的黑客这篇文章后来什么都没有工作...
我真的不知道如何实现这一点,任何帮助,将不胜感激。
提前致谢。
快速回答:
配置你的JavaScript测试使用截断,而不是交易:
DatabaseCleaner.strategy = :truncation
更详细的解释:
交易策略不使用JavaScript测试中很好地工作,因为大多数支持JavaScript的水豚驱动程序在不同的线程比应用程序代码运行测试。
下面是该过程的基本轮廓:
- 水豚启动时使用的WEBrick或薄在后台线程机架应用。
- 主线程设置驱动器,提供机架应用程序运行的端口。
- 您的测试要求司机与应用程序,从而导致伪造的Web浏览器来执行你的应用的请求进行交互。
这是必要的,因为这是很难做出执行针对内存机架应用程序请求一个假的浏览器。 在某些数据库驱动程序,它不是安全地执行多个线程查询对同一事务。
这样做的最终结果是,你需要提交事务在您的测试代码,以使数据能够在应用程序代码中可见。 解决这个问题的最简单的方法是使用数据库截断清洁的生产策略。
您可以配置RSpec的(或黄瓜)使用交易的一切,但JavaScript的测试。 这将是对非JavaScript测试的速度,同时还对JavaScript的测试工作。
Avdi格林对这个问题的一个很好的博客贴子,详细描述了解决方案: http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
基于事务startegies不黄瓜工作。 这样做的原因是,你必须运行两个独立的过程,一个是运行你的应用程序服务器,然后另外一个做实际的请求。 周围有这种不同的方式,但他们是肮脏的黑客。 干净的解决方案是使用截断你DatabaseCleaner策略。
DatabaseCleaner.strategy = :truncation
Before do
DatabaseCleaner.clean_with :truncation
end