使用 capybara-webkit 检测到死锁

2023-12-22

我正在尝试通过这个规范:

scenario "Edit a service", js: true do
  service = create_service_for(provider, title: "First service")
  fill_edit_service_form(service)
  expect(page).to have_css('#price', text: '10,00 $')
end

这是使用水豚的标准 Rails 规范。我正在使用 capybara-webkit 处理所有带有 javascript 的场景。当我尝试通过它时,有时它有效,有时它标记数据库中缺少记录,有时我遇到此错误:

Run options: include {:locations=>{"./spec/acceptances/provider_services_spec.rb"=>[31]}}
[K  1) Provider Services Edit a service
     Failure/Error: Unable to find matching line from backtrace
     ActiveRecord::StatementInvalid:
       PG::TRDeadlockDetected: ERROR:  deadlock detected
       DETAIL:  Process 24164 waits for AccessExclusiveLock on relation 3446991 of database 3446538; blocked by process 24184.
       Process 24184 waits for AccessShareLock on relation 3446902 of database 3446538; blocked by process 24164.
       HINT:  See server log for query details.
       : ALTER TABLE "active_admin_comments" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_territory_provideds" DISABLE TRIGGER ALL;ALTER TABLE "provider_services" DISABLE TRIGGER ALL;ALTER TABLE "provider_divisions" DISABLE TRIGGER ALL;ALTER TABLE "provider_profiles" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_intervention_level_provideds" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_medium_provideds" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_service_provideds" DISABLE TRIGGER ALL;ALTER TABLE "regions" DISABLE TRIGGER ALL;ALTER TABLE "service_formulas" DISABLE TRIGGER ALL;ALTER TABLE "region_translations" DISABLE TRIGGER ALL;ALTER TABLE "artists" DISABLE TRIGGER ALL;ALTER TABLE "admin_users" DISABLE TRIGGER ALL;ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "services" DISABLE TRIGGER ALL;ALTER TABLE "services_provided" DISABLE TRIGGER ALL;ALTER TABLE "territories_provided" DISABLE TRIGGER ALL;ALTER TABLE "users" DISABLE TRIGGER ALL;ALTER TABLE "countries" DISABLE TRIGGER ALL;ALTER TABLE "coupons" DISABLE TRIGGER ALL;ALTER TABLE "currencies" DISABLE TRIGGER ALL;ALTER TABLE "formulas" DISABLE TRIGGER ALL;ALTER TABLE "collector_profiles" DISABLE TRIGGER ALL;ALTER TABLE "country_translations" DISABLE TRIGGER ALL;ALTER TABLE "images" DISABLE TRIGGER ALL;ALTER TABLE "intervention_levels_provided" DISABLE TRIGGER ALL;ALTER TABLE "measure_units" DISABLE TRIGGER ALL;ALTER TABLE "media_provided" DISABLE TRIGGER ALL;ALTER TABLE "messages" DISABLE TRIGGER ALL;ALTER TABLE "page_part_translations" DISABLE TRIGGER ALL;ALTER TABLE "orders" DISABLE TRIGGER ALL;ALTER TABLE "painting_categories" DISABLE TRIGGER ALL;ALTER TABLE "page_services" DISABLE TRIGGER ALL;ALTER TABLE "page_translations" DISABLE TRIGGER ALL;ALTER TABLE "painting_category_translations" DISABLE TRIGGER ALL;ALTER TABLE "page_parts" DISABLE TRIGGER ALL;ALTER TABLE "pages" DISABLE TRIGGER ALL;ALTER TABLE "painting_provenances" DISABLE TRIGGER ALL;ALTER TABLE "painting_prices" DISABLE TRIGGER ALL;ALTER TABLE "painting_technic_translations" DISABLE TRIGGER ALL;ALTER TABLE "painting_technics" DISABLE TRIGGER ALL;ALTER TABLE "painting_type_translations" DISABLE TRIGGER ALL;ALTER TABLE "period_translations" DISABLE TRIGGER ALL;ALTER TABLE "painting_types" DISABLE TRIGGER ALL;ALTER TABLE "paintings" DISABLE TRIGGER ALL;ALTER TABLE "periods" DISABLE TRIGGER ALL
     # -e:1:in `<main>'

 1/1 |========================= 100 ==========================>| Time: 00:00:03 

Finished in 3.41 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/acceptances/provider_services_spec.rb:29 # Provider Services Edit a service
     Screenshot: /home/dougui/rails/lescollectionneurs/tmp/capybara/screenshot_2014-02-20-18-22-55.658.png

Randomized with seed 34053

我在桌子上有一把锁。这并不总是同一张表。

当我这样做时效果更好:

Capybara.reset_sessions!
DatabaseCleaner.clean

在规范之前和之后,但它并不总是有效。如果我在同一个文件中运行所有规格,我就无法工作。

当我正在处理不相关的事情时它会附加。它与恶作剧鬼一起工作。

这是我的spec_helper 文件:

ENV["RAILS_ENV"] ||= 'test'
require 'rubygems'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rails'
require 'capybara-webkit'
require 'database_cleaner'
require 'capybara/firebug'
require 'capybara-screenshot/rspec'

if defined?(Spring)
  Spring.watch "#{Rails.root}/spec/factories"
else
  require 'shoulda-matchers'
end

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.infer_base_class_for_anonymous_controllers = false
  config.use_transactional_fixtures = false
  config.order = "random"

  config.include FactoryGirl::Syntax::Methods
  config.include Warden::Test::Helpers, type: :feature
  config.include FeatureHelpers, type: :feature
  config.include Devise::TestHelpers, type: :controller
  config.include ControllerHelpers, type: :controller
  config.include EmailSpec::Helpers
  config.include EmailSpec::Matchers

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    if example.metadata[:js]
      DatabaseCleaner.strategy = :truncation
    else
      DatabaseCleaner.start
    end
  end

  config.after(:each) do
    DatabaseCleaner.clean
    DatabaseCleaner.strategy = :transaction if example.metadata[:js]
  end
end

Capybara.javascript_driver = :webkit

include ActionDispatch::TestProcess
I18n.locale = :fr

Geocoder.configure(:lookup => :test)

Geocoder::Lookup::Test.set_default_stub(
  [
    {
      'latitude'     => 40.7143528,
      'longitude'    => -74.0059731,
      'address'      => 'New York, NY, USA',
      'state'        => 'New York',
      'state_code'   => 'NY',
      'country'      => 'United States',
      'country_code' => 'US'
    }
  ]
)

这是使用的宝石:https://github.com/GCorbel/lescollectionneursassocies/blob/master/Gemfile https://github.com/GCorbel/lescollectionneursassocies/blob/master/Gemfile.

有什么建议么?

有关更多详细信息,请查看 Github 存储库:https://github.com/GCorbel/lescollectionneursassocies/ https://github.com/GCorbel/lescollectionneursassocies/.


发生这种情况是因为您有两个线程(测试线程和请求线程)异步修改数据库。看起来您已经在您的spec_helper 中尝试了不同的配置,这是正确的。我花了相当多的时间来解决同样的问题,并提出了这个:

# adapted from https://gist.github.com/moonfly/4950750

require 'database_cleaner'

RSpec.configure do |config|

  config.use_transactional_fixtures = false

  config.before( :suite ) do
    DatabaseCleaner.clean_with :truncation
    DatabaseCleaner.strategy = :transaction
  end

  config.around( :each ) do |spec|
    if spec.metadata[:js]
      # JS => doesn't share connections => can't use transactions
      spec.run
      DatabaseCleaner.clean_with :deletion
    else
      # No JS/Devise => run with Rack::Test => transactions are ok
      DatabaseCleaner.start
      spec.run
      DatabaseCleaner.clean

      # see https://github.com/bmabey/database_cleaner/issues/99
      begin
        ActiveRecord::Base.connection.send :rollback_transaction_records, true
      rescue
      end
    end
  end

end

我将其全部保存在 support/database_cleaner_configuration.rb 中,这也对您有用,或者您可以简单地替换您在 spec_helper 中的内容。如果这不起作用,请告诉我 - 我还有一些其他想法,但它们更奇怪,如果这有效,则不值得研究,这可能会......

Note:

值得一提的是,Rails 5.1+ 解决了数据库问题。 Rails 团队中的 Eileen Uchitelle 制作必要的改变 https://github.com/rails/rails/pull/28083运行确保测试线程和Rails服务器可以通过共享数据库连接在同一进程中运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 capybara-webkit 检测到死锁 的相关文章

  • 使用 ruby​​ Net::SSH 通过 sudo 读取远程文件

    我必须读取我有权 sudo 读取的远程文件的内容 猫 少或尾巴 我将在 Ruby 中执行此操作 因此我认为应该使用 Net SSH 来执行此操作 该文件是一个日志文件 因此可能会很大 这是我现在正在尝试的代码 require rubygem
  • 如何在Rails中管理没有id的表?

    我有两个模型 人模型和关系模型 第二个存储有关两个人之间关系的信息 它有parent id和child id字段 但没有id字段 我将它与 has many through 连接起来并且它有效 But 即使表中存在某些关系 因为没有 id
  • 通俗地说,Ruby on Rails ORM 是什么?请解释

    我无法理解 Ruby on Rails 中的 ORM 据我了解 表 列和对象 属性之间存在 1 1 的关系 所以每条记录都是一个对象 另外 模型到底是什么 我知道它映射到一张桌子 我真正追求的是对上述内容有更深入的理解 预先感谢您的帮助 我
  • Ruby,通过 SSH 和 LOG 逐一运行 linux 命令

    我想用 Ruby 女巫 net ssh 编写代码 在远程 Linux 机器上一一运行命令并记录所有内容 在 Linux 机器上称为命令 stdout 和 stderr 所以我写函数 def rs ssh cmds cmds each do
  • 是否可以在 proc 中查看 ruby​​ 代码?

    p Proc new puts ok 是否可以在过程中看到 ruby 代码 inspect返回内存位置 puts p inspect
  • Ruby on Rails 中的枚举

    我是一名 C 程序员 我正在研究 ruby on Rails 但我可能在心态或其他方面遇到了一些麻烦 我有一个投票对象 该对象可以是赞成 中立或反对 我通常会让投票对象有一个像这样的字段 private VoteEnum voteEnum
  • 字符串被两个不同的分隔符分割

    我有这样的字符串 some dasd dasd dasdas dasdas dasd das dsad 我需要用两个不同的符号将字符串拆分为数组 and 所以我想得到数组 some dasd dasd dasdas dasdas dasd
  • Rails 5.2 Active Storage 添加自定义属性

    我有一个带有附件的模型 class Project lt ApplicationRecord has many attached images end 当我附加并保存图像时 我还想保存一个附加的自定义属性 display order 整数
  • 回形针:从带扩展名的 url 上传

    我想通过 S3 存储上的回形针从 URL 上传图片 我与 Ruby 1 9 3 Rails 3 2 6 paperclip 3 1 3 aws sdk 1 3 9 我有我的图片模型 class Asset has attached file
  • 将局部变量传递给视图加载后渲染的局部变量

    Update 我刚刚发现另一个线程解释了为什么我遇到这个问题 将本地 Rails 变量传递给 JavaScript 到部分 https stackoverflow com questions 12342058 pass local rail
  • 使用 Ruby 替换文件中的特定行

    我有一个如下所示的文本文件 a txt open close open open close open 我需要找到一种方法将第三行替换为 close 我做了一些搜索 大多数方法都涉及搜索该行而不是替换它 在这里不能真正做到这一点 因为我不想
  • 为 .API 文件启用自动完成功能?

    有谁知道如何使用 N 站点上提供的 API 文件在 Notepad 中自动完成工作 在 API 文件夹中具有 XML 自动完成文件的语言中 自动完成功能工作得很好 但对于使用 API 文件的语言 ruby AutoIt 等 完全不起作用 根
  • Ruby On Rails 与 Windows Vista - 最佳设置? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您认为 Win Vista 环境中 RoR 的最佳设置是什么 我尝试过 radrails eclipse 插件 它对我来说似乎太庞大了 我也开始
  • 如何在 Rails 3 中连接表并计算记录数?

    我有一个Collection有很多硬币的类 我正在尝试选择拥有两枚以上硬币的收藏品 目前 我可以直接通过 Ruby 来完成此操作 但效率极低 我当前的代码 collections Collection all select c c coin
  • 在 Rails App 中实现 WrapBootstrap 主题

    我刚刚购买了一个 wrapbootstrap 主题 并尝试将其插入我的 Rails 应用程序中 一些 css 如填充 导航栏 字形图标 和大多数 javascript 无法正常运行 我将所有样式表和 javascript 分别复制到 ass
  • 如何将 STDOUT 捕获到字符串?

    puts hi puts bye 我想存储到目前为止代码的 STDOUT 在本例中 hi nbye 到变量中说 结果 并打印它 puts result 我这样做的原因是我已将 R 代码集成到我的 Ruby 代码中 当 R 代码运行时 其输出
  • 将 Rails 5.2 升级到 6.0 时出现参数错误数量错误

    我正在尝试将旧站点从 Rails5 2 升级到 6 0 然后再升级到 6 1 推荐的路径 我收到了有关参数数量错误的各种错误 其中一些错误我已通过更新或删除各种 gem 设法清除 最后我被困在了这一点上 rbenv versions 3 0
  • 从 Rails 2.3.8 升级到 4.0

    我正在 Rails 2 3 8 上运行一个应用程序 我计划将其升级到 Rails 4 0 RC 版 对我来说最简单的方法是什么 我需要先升级到 Rails 3 x 吗 注意 在我当前的实现中 我使用八哥和雪貂 作为升级的一部分 我也在考虑搬
  • 平衡付款 - 有关获取现有买家和商家账户参考信息的文档

    我如何获得已创建的买家和商家帐户的参考 我只是找到创建买家和商家帐户的示例 我没有找到任何有关获取该信息以供重用的示例 是否有关于此的现有文档或只是 rdoc 中的内容 根据对 rdoc 的引用 我假设您在这里使用 Ruby gem 使用唯
  • 使用 PostgreSQL 的模式和 Rails 创建多租户应用程序

    我已经想通的事情 我正在学习如何在 Rails 中创建多租户应用程序 该应用程序根据用于查看应用程序的域或子域来提供来自不同模式的数据 我已经回答了一些问题 如何让 subdomain fu 也能与域一起使用 这是有人问了同样的问题 htt

随机推荐

  • 使用 ODP.NET 从 PL/SQL 函数获取 RECORD,无需接触 PL/SQL 代码

    标题非常不言自明 从 C 应用程序 使用 ODP NET 我尝试调用一个 PL SQL 函数 该函数返回的不是一个简单的值 而是一条记录 不幸的是 我无权添加或更改 PL SQL 代码 因此尝试将函数包装在另一个返回不同类型的函数中对我来说
  • 十进制浮点数与二进制的相互转换

    简而言之 我的问题是 为什么浮点数中的舍入误差仅在计算后出现 而不是在存储文字时出现 我的意思是这样的 我知道在十进制与二进制相互转换时由于浮点数的舍入误差而出现的问题 例如 在 Java 中 double a 10 567 double
  • 相当于 C# 中 string.Format 的 CLR 函数

    我正在寻找一个 CLR 函数 它可以执行与 C 中的 String Format 相同的操作 作为示例 我想通过 CLR 函数执行以下操作 String Format My name is 0 and I live in 1 myName
  • 如何防止 org-mode 执行所有 babel 源代码块?

    我有一个 org 文件 里面有很多 babel 源代码块 只需要在代码更改时重新执行 如何防止 org 在导出期间执行所有块 换句话说 将它们全部设置为仅手动执行 我更喜欢单个全局选项 而不必单独编辑每个块 变量org export bab
  • C++ 异常二进制兼容性

    我的项目使用 2 个不同的 C 编译器 g 和 nvcc cuda 编译器 我注意到 g 对象文件中没有捕获从 nvcc 对象文件抛出的异常 C 异常应该在同一台机器上二进制兼容吗 什么会导致这种行为 try kernel new cuda
  • SQL 更新后,wso2 数据服务能否返回受影响的行?

    我已经使用 WSO2 数据服务连接到数据库一段时间了 一切都很完美 只是在 SQL 更新脚本之后我仍然无法获取受影响的行 我已经按照向导一遍又一遍地尝试 但没有找到解决方案 有谁知道如何获得吗 感谢您的提前回复 恐怕没有办法直接获取更新的行
  • makefile 的错误检查行为

    如果我的程序必须为不同的结果 主要是错误 返回不同的值 例如 0 1 2 3 等 则调用该程序的 makefile 将必须停止执行其余的 makefile 命令 即使该命令产生错误 返回非零值 是否有办法继续执行 makefile 谢谢你们
  • 当文件没有 .py 扩展名时为 python 运行 Flymake

    我根本不是一个 lisp 人 但我的主要脚本环境位于 emacs 上 当文件上没有 py 扩展名时 我需要一些帮助来运行我的 Flymake pyflakes 因为我工作中的一些脚本没有 py 扩展名 当我读取 编码扩展名为 py 的文件时
  • 为什么 Firefox 对输入元素使用 IE 框模型?

    尝试以下简单示例 div div div
  • TS-Jest 实用程序丢失

    Well using ts jest 27 x x I could access the utils helper by require ts jest utils and as you can see in the below pictu
  • 将 List 添加到 JSONArray

    我正在尝试使用 JSON 库创建 JSON 目前我正在创建 JSONArray 添加以将列表中的所有值添加到其中 但我面临这个问题 JSONArray 类型中的方法 put int boolean 不适用于参数 String List 在这
  • 在 ListBox 中记录用户可见的项目

    我有一个列表框或数据网格 其中包含数千个条目 我想知道用户查看过的项目 滚动 搜索或其他方式 我如何知道列表框中的用户可以看到什么 奖励 设置一个计时器 以便该项目必须显示至少 N 毫秒 如果用户只是拉下滚动条 Update 这几乎是重复的
  • 如何阻止应用程序在崩溃时重新启动并使崩溃可见?

    我正在开发一个应用程序并使用华为手机进行测试 每当发生崩溃时应用程序就会重新启动并且日志消失 开发人员选项中是否有任何设置或其他设置可以让崩溃对话框出现并显示崩溃日志 我最近了解到这一点 希望对其他人有帮助 像平常一样进行调试 但一旦发生崩
  • Internet Explorer:SCRIPT7002:XMLHttpRequest:网络错误 0x2f7d,由于错误 00002f7d,无法完成操作

    这个问题快把我逼疯了 我们的 Web 应用程序使用 HTTP POST 登录用户 现在 IE 10 正在中止连接并显示 SCRIPT7002 XMLHttpRequest Network Error 0x2f7d Could not com
  • openssl aes gcm 加密,带身份验证 TAG;命令行

    我正在尝试使用 openssl th 命令行以 AES GCM 模式加密文件 openssl enc aes 256 gcm p iv 000000000000000000000000 K 0000000000000000000000000
  • 为什么 jPlayer 无法在 Firefox 中播放我的 MP3 文件?

    我在 Firefox 8 中使用 jQuery Jplayer 播放 MP3 文件时遇到问题 我已经为我的浏览器安装了最新的 Flash 并且我可以看到 jplayer swf 文件正在 Firebug 的 Flash 选项卡中下载 我按此
  • 如何更新reducer中嵌套对象的值?

    我已经像这样建立了我的国家 const list categories Professional active false names id 1 name Golf active false id 2 name Ultimate Frisb
  • 如何通过 Java AWS SDK 使 Cloudfront CDN 提供的文件(待刷新)失效?

    我正在使用 Java SDK 将图像上传到 S3 如何使 CloudFront 中的文件无效 以便从 s3 源重新获取该文件 如何通过Java SDK做到这一点 import com amazonaws services cloudfron
  • 过滤泛型类型

    我正在尝试使用 TypeScript 编写一个函数 该函数允许我根据对象的类型过滤对象列表 结果应该是一个允许我执行以下任一操作的函数 filter
  • 使用 capybara-webkit 检测到死锁

    我正在尝试通过这个规范 scenario Edit a service js true do service create service for provider title First service fill edit service