Rails::TestUnit::Runner.run NameError: uninitialized constant

191 views Asked by At

On Rails 6 (6.1.4.1) we had a RakeFile that would run a subset of tests. For example:

# lib/tasks/carrier.rake
namespace :test do
  task carriers: "test:prepare" do
    $: << "test"
    test_files =  FileList["test/models/carrier_test.rb",
                           "test/controllers/admin/carriers/**/*_test.rb",
                           "test/system/admin/carriers/**/*_test.rb"]
    Rails::TestUnit::Runner.run(test_files)
  end
end

This would execute just fine when called:

rails test:carriers

However, somewhere along the way, something changed and we began seeing errors when trying to run our RakeFile test tasks. (I haven't tracked down exactly what changed and when it changed -- perhaps it was part of the Rails 7 release.) Here's the error we began seeing:

rails aborted!
NameError: uninitialized constant Shoulda

Shoulda::Matchers.configure do |config|
^^^^^^^
/path/test/test_helper.rb:15:in `<main>'
/path/test/models/carrier_test.rb:1:in `<main>'
/path/lib/tasks/carriers.rake:11:in `block (2 levels) in <main>'
Tasks: TOP => test:carriers
(See full trace by running task with --trace)

The error appeared with no changes to our tests or environment configuration. (Running a full rake worked just fine.)

1

There are 1 answers

0
Ron Shinall On

When reviewing the source code for Rails::TestUnit::Runner, I came across rake_run. Simply replacing Rails::TestUnit::Runner.run with Rails::TestUnit::Runner.rake_run addressed the issue (no other changes required):

# lib/tasks/carrier.rake
namespace :test do
  task carriers: "test:prepare" do
    $: << "test"
    test_files =  FileList["test/models/carrier_test.rb",
                           "test/controllers/admin/carriers/**/*_test.rb",
                           "test/system/admin/carriers/**/*_test.rb"]
    Rails::TestUnit::Runner.rake_run(test_files)
  end
end