Capybara webkit的数据库清理问题

时间:2013-04-11 09:33:05

标签: ruby-on-rails cucumber capybara capybara-webkit database-cleaner

我正在使用Cucumber编写集成测试和Database Cleaner来保持我的数据库干净。一切都很完美,因为我的测试不需要Javascript。

我可以使用Capybara 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

我尝试了类似于this的内容来检查Capybara使用的驱动程序,但它不起作用。我也试过了this post第三部分中提到的黑客攻击,但后来没有任何工作......

我真的不知道如何实现这一点,我们将非常感谢任何帮助。

提前致谢。

2 个答案:

答案 0 :(得分:23)

快速回答:

将JavaScript测试配置为使用截断而不是事务:

DatabaseCleaner.strategy = :truncation

更长的解释:

事务策略不适用于JavaScript测试,因为大多数支持JavaScript的capybara驱动程序在与应用程序代码不同的线程中运行测试。

以下是该过程的基本概要:

  • Capybara使用webrick启动机架应用程序,或者在后台线程中启动。
  • 主线程设置驱动程序,提供运行机架应用程序的端口。
  • 您的测试要求驱动程序与应用程序进行交互,这会导致虚假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/

答案 1 :(得分:0)

基于交易的初学者不适用于黄瓜。这样做的原因是您有两个独立的进程在运行,一个运行您的应用服务器,然后另一个运行实际请求。有不同的方法,但它们是脏的黑客。干净的解决方案是使用截断作为DatabaseCleaner策略。

DatabaseCleaner.strategy = :truncation

Before do
  DatabaseCleaner.clean_with :truncation
end