Posted 6 months ago. Visible to the public.

Heads up: Byebug has problems with zeitwerk

I encountered a unlucky behavior of byebug 11.1.3 (the most recent version at time of writing) when using it with Rails 6 and it's new autoloading component, zeitwerk. There already is a issue Archive for that, so I hope it will be fixed with a future release.

The following test succeeds:

Copy
context 'factories' do let(:test_case) { FactoryBot.create(:test_case) } it 'are valid' do expect(test_case).to be_valid end end

But when I did the same in byebug the following happened:

Copy
(byebug) FactoryBot.create(:test_case) *** NameError Exception: uninitialized constant #<Class:0x000055580a8e7918>::TargetLimitation Did you mean? TargetsTestScenario

It seems like Byebug does not work well with zeitwerk.

Solutions

Good: Use a different debugger

Jard Archive seems also to have problems with zeitwerk, since the create statement just didn't return.
Pry Archive (binding.pry) worked without problems for me.

Neutral: Use eager loading in tests

Eager loading means all classes are loaded before the code starts executing. Be aware that this could have an impact on the performance of tests.

config/environments/test.rb:

Copy
config.eager_load = true

Bad: Switch back to use the classic autoloading

config/application.rb:

Copy
config.autoloader = :classic

Your choice of debugger should not force you to use old/different settings in the whole application. You can do that temporarily though.

Even more bad: explicitly require the not found class

This will leave you with a mess of requires that has to be maintained and be cleaned up in the future. You can do that temporarily though.

Also quite bad: Explicitly mention the class before your debugger statement

Copy
# ... (code) TestCase::TargetLimitation debugger # ... (more code)

This will leave you with a mess of calls to the class that has to be maintained and be cleaned up in the future. You can do that temporarily though.

Your development team has a full backlog of feature requests, chores and refactoring coupled with deadlines? We are familiar with that. With our "DevOps as a Service" offering, we support developer teams with infrastructure and operations expertise.

Owner of this card:

Avatar
Judith Roth
Last edit:
5 months ago
by Judith Roth
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Judith Roth to makandra dev
This website uses short-lived cookies to improve usability.
Accept or learn more