Rails 7.0.4
Rspec 3.11.0
Capybara 3.37.1
selenium-webdriver (gem) 4.5.0
with Ruby-debug (gem 'debug', platforms: %i[ mri mingw x64_mingw ]
) in Gemfile
whenever I try to add Capybara.using_session
call, my suite hangs.
it hangs after it completes all the specs, even when passing.
my driver is set to :
Capybara.default_driver = :selenium_chrome_headless
but I noticed it happens if I change the driver to Capybara.default_driver = :selenium_chrome
also
here's the spec that reproduces it:
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
I have isolated it to these THREE conditions :
using Capybara.using_session and visiting a page using
visit
inside the using_session block (if I remove either the visit or the using_session, it works)In another test in the same suite, visiting any other page using
visit
(if I remove thevisit
call in the other spec, it works)the
debug
gem (ruby-debug) (if I removegem 'debug', platforms: %i[ mri mingw x64_mingw ]
from the Gemfile)
This is a very strange bug.
my spec/rails_helper.rb
file is
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
IMPORTANT: Although I have isolated it this far, I am strangely unable to isolate it any further or even able to reproduce it in a new Rails app, even though this Rails app is just a month old.
Here, I have taken the app where it is broken and removed everything else (really, I removed EVERYTHING and the hang still happens).
I have compared the remaining code carefully to a newly generated app and bizarrely I cannot reproduce the same bug (Using the exact same spec and setup) in a new app, so it must involve a 4th unknown variable I cannot see yet.
REPRODUCTION
Bare-bones reproduction app here: https://github.com/jasonfb/StrangeCapybaraHang
This app was created as a FORK of my app, then I removed everything non-essential. Notice that it contains almost nothing, and only 1 spec.
When I run rspec on this app (broken), see "DEBUGGER: Attaching after process 77726 fork to child process 77733" AND the suite hangs after it runs
Here, on this 2nd attempt to recreate the problem, I tried to go forward to create the bug: https://github.com/jasonfb/StrangeCapyHangForward
I setup a new Rails app and then attempted to recreate all of the conditions explained above to produce the bug... BUT... I can't reproduce the bug in this new app!!
So that means even though I've identified the 3 elements of the bug, there MUST be a 4th element I am not seeing yet.
Notice that in this app, it has same exact spec (see spec/system/test_capy_hand_spec.rb), the same exact rails_helper file, the same exact Gems, etc as the other repo where the bug manifests.
However, on this app, I never see "DEBUGGER: Attaching after process 77726 fork to child process...." even when debug
Gem is in the Gemfile. Why is that?
I also DO NOT see the hang.