gpt4 book ai didi

ruby-on-rails - Capybara webkit 的数据库清理器问题

转载 作者:行者123 更新时间:2023-12-04 02:53:01 25 4
gpt4 key购买 nike

我正在使用 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第三部分提到的hack但后来什么都没有用...

我真的不知道如何实现这一点,任何帮助将不胜感激。

提前致谢。

最佳答案

快速回答:

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

DatabaseCleaner.strategy = :truncation

更长的解释:

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

以下是该过程的基本概述:
  • 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/

    关于ruby-on-rails - Capybara webkit 的数据库清理器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945349/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com