ruby-on-rails Rails、Capybara.using_session(...)、访问页面和进行ruby-debug会导致rspec suite在运行后挂起,即使所有规范都通过了

db2dz4w8  于 2022-12-15  发布在  Ruby
关注(0)|答案(2)|浏览(106)

bounty将在7天后过期。回答此问题可获得+200声望奖励。Jason FB希望引起更多人对此问题的关注:这是我第一次在堆栈溢出的帖子上提供奖金。要获得奖金,您的答案必须导致从头开始重新创建错误(就像我对github.com/jasonfb/StrangeCapyHangForward所做的那样),这样我们就知道了第四个未知数是什么。实际上,您可以克隆或派生github.com/jasonfb/StrangeCapyHangForward,然后使用该repo添加bug(这是违反直觉的),但肯定会识别出第四个未知变量。
导轨7.0.4
风险规范3.11.0
水豚3.37.1
在宝石文件中使用Ruby调试(gem 'debug', platforms: %i[ mri mingw x64_mingw ]

每当我试图添加Capybara.using_session调用时,我的套件就会挂起。它在完成所有规范后挂起,即使通过也是如此。
我的驱动程序设置为:

Capybara.default_driver = :selenium_chrome_headless

但我注意到如果我将驱动程序更改为Capybara.default_driver = :selenium_chrome也会发生这种情况
以下是重现它的规范:

require 'rails_helper'

describe "client app", type: :feature  do
  describe "when starting the experience", type: :feature do
    # TODO: figure out why capy is hanging here

    it "can load the home page" do
      # THIS CAUSES AFTER-RSPEC HANG even though all specs pass
      Capybara.using_session("client session") do
        visit "/"
      end
    end

    it "loads with a client id" do
      visit '/'
    end
  end
end

我将其分离为***以下三种***情况:
1.使用Capybara.using_session并使用using_session块中的visit访问页面(如果我删除了visit或using_session,它就可以工作)
1.在同一套件中的另一个测试中,使用visit访问任何其他页面(如果我删除其他规范中的visit调用,它就可以工作)

  1. debug gem(ruby-debug)(如果我从gem文件中删除gem 'debug', platforms: %i[ mri mingw x64_mingw ]

这是一个非常奇怪的错误。

Capy Hang看起来像:

我的spec/rails_helper.rb文件是

require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'

abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'

require 'capybara/rails'
require 'capybara/rspec'

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!

end

Capybara.default_driver = :selenium_chrome_headless

重要提示:虽然我已经隔离到这里,但奇怪的是,我无法进一步隔离它,甚至无法在新的Rails应用程序中重现它,尽管这个Rails应用程序才成立一个月。
在这里,我已经采取了应用程序的地方,它是坏的,删除其他一切(真的,我删除了一切,挂起仍然发生)。
我已经仔细地将剩余的代码与新生成的应用程序进行了比较,奇怪的是,我无法在新应用程序中重现相同的错误(使用完全相同的规范和设置),因此它必须涉及我还看不到的第4个未知变量。

生殖

裸骨复制应用程序在这里:https://github.com/jasonfb/StrangeCapybaraHang
这个应用程序是作为我的应用程序的一个分支创建的,然后我删除了所有不必要的东西。注意,它几乎什么都不包含,只有一个规范。
当我在这个应用程序上运行rspec时(已损坏),请参见“调试器:在进程77726派生到子进程77733后附加”并且套件在运行

后挂起
在这里,在第二次尝试重现问题时,我尝试 * 前进 * 以创建bug:https://github.com/jasonfb/StrangeCapyHangForward
我安装了一个新的Rails应用程序,然后尝试重新创建上面解释的所有条件,以产生错误...但是...我无法在这个新应用程序中重现错误!!
所以这意味着即使我已经确定了bug的3个元素,也一定有第4个元素我还没有看到。
请注意,在此应用程序中,它与显示错误的其他存储库具有完全相同的规范(请参见spec/system/test_capy_hand_spec.rb)、完全相同的rails_helper文件、完全相同的Gems等。
但是,在这个应用程序上,我从来没有看到“调试器:在进程77726派生到子进程之后附加....”,即使debug Gem在Gemfile中也是如此。为什么会这样?
我 * 也 * 没有看到挂。

提供的边界2022-12-14(200个堆栈溢出点)

这是我第一次在堆栈溢出的帖子上提供奖励。要获得奖励,您的答案必须导致从头开始重新创建错误(就像我对https://github.com/jasonfb/StrangeCapyHangForward所做的那样),这样我们就知道了第四个未知数是什么。实际上,您可以克隆或派生https://github.com/jasonfb/StrangeCapyHangForward,然后使用该repo添加bug(这是违反直觉的),但肯定会识别出第四个未知变量。

chhqkbe1

chhqkbe11#

问题出在selenium-webdriver gem中,您的测试项目中当前的版本是4.5.0,如果升级到4.7.1,应该可以立即解决您的问题。
步骤
1.将gem 'selenium-webdriver', '4.7.1'添加到宝石文件中。

  1. bundle install
    1.运行rspec。不再挂起!
    注:您可能需要grep并终止现有的rspec进程。例如:
ps -ax | grep rspec
# take process ids for all the above and run (substituting 71529 for your pids): 
kill -9 71529
# Example Gemfile
group :development, :test do
  gem 'debug', platforms: %i[ mri mingw x64_mingw ]
  gem 'rspec-rails'
  # add selenium-webdrive gem coded to 4.7.1
  gem 'selenium-webdriver', '4.7.1'
end

我相信这个问题与并发性和rspec没有正确地kill所有的测试过程有关,尽管这很难确认,我们的测试套件和并发性也有很大的问题,直到我们强制升级了许多gem(包括依赖项)。
例如,在升级之前,运行rspec几次并grep您的进程:ps -ax | grep rspec。您将在那里看到许多现有的。我确实检查了selenium-webdrive changelog,以查看是否有任何明显的问题会导致此问题,但我没有看到任何问题。

重现

请注意,如果您将较旧的gem添加到您的工作存储库中,则会重现该问题:

# Gemfile of StrangeCapyHangForward
group :development, :test do
  gem 'debug', platforms: %i[ mri mingw x64_mingw ]
  gem 'rspec-rails'
  # add the older version of the gem
  gem 'selenium-webdriver', '4.5.0'
end

然后,bundle install && rspec。它将挂起。
总之,希望这能帮上忙!祝你好运!

hmae6n7t

hmae6n7t2#

尝试删除debug gem,因为它可能导致了水豚的问题。

相关问题