Fix Rails upgrade test failures
After bumping Rails or advancing config.load_defaults, the test suite is where breakage shows up. Most failures trace back to a flipped framework default, a Zeitwerk naming issue, or a deprecation that became an error — fix the root cause rather than pinning the old behavior.
Last verified · Updated May 22, 2026
After a Rails bump or a config.load_defaults advance, the test suite is where the upgrade's breakage surfaces. Most failures trace to a flipped framework default, a Zeitwerk autoload mismatch, or a deprecation that became a hard error. Fix the root cause; resist pinning the old behavior just to make tests pass.
Symptoms
- NameError/LoadError on boot or first test — a Zeitwerk file/constant mismatch.
- Deprecation warnings that became errors after config.load_defaults advanced.
- Strong-parameters or callback-order failures from changed framework defaults.
- Frozen-string or time-zone behavior differences in assertions.
Likely causes
- config.load_defaults advanced before the suite was actually green.
- A file name that does not match its constant under Zeitwerk.
- A gem that monkey-patches a removed or changed Rails internal.
- Tests asserting on behavior that a new default intentionally changed.
Diagnostic commands
# Re-run a single failing test with a full backtrace$ bin/rails test test/models/user_test.rb -b# Confirm autoloading is clean$ bin/rails zeitwerk:checkThese tests started failing after upgrading Rails / advancing config.load_defaults. Here is the failure and backtrace: <paste>. Determine whether the cause is (a) a Zeitwerk autoload naming mismatch, (b) a changed framework default, (c) a deprecated-to-removed API, or (d) a test asserting on intentionally-changed behavior. Propose the smallest root-cause fix, and only suggest restoring the old default as a temporary, clearly-labeled measure.
Safety: Do not mask failures by reverting config.load_defaults wholesale or rescuing exceptions to make tests pass.
Safe fix workflow
- Reproduce one failure in isolation with a full backtrace before changing code.
- Run `bin/rails zeitwerk:check` and fix any naming mismatch first.
- For each deprecation, adopt the new API rather than silencing the warning.
- Update tests that assert on behavior a new default intentionally changed.
- Re-run the full suite and confirm it is green before advancing further.
Escalation checklist
- A failure traces to a gem that has no Rails-compatible release
- A changed default has unclear or undocumented behavior
- A fix would require a risky database migration
Related upgrade pages
Official sources
Backs the breaking-change and migration-step claims.