thoughtbot/shoulda-matchers · error · TestFrameworkNotConfigured
You need to set a test framework. Please add the following t
Error message
You need to set a test framework. Please add the following to your
test helper:
Shoulda::Matchers.configure do |config|
config.integrate do |with|
# Choose one:
with.test_framework :rspec
with.test_framework :minitest # or, :minitest_5
with.test_framework :minitest_4
with.test_framework :test_unit
end
end
What it means
TestFrameworkNotConfigured is raised by Shoulda::Matchers::Integrations::TestFrameworks::MissingTestFramework#validate! (lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb:9-24). MissingTestFramework is a placeholder object seeded as the default when an Integrations::Configuration is created (configuration.rb:16 calls test_framework :missing_test_framework); it survives only if your configure block never calls with.test_framework, and its validate! exists solely to abort with these instructions. Since shoulda-matchers 3.0 the gem no longer auto-detects your test framework — you must declare it in a Shoulda::Matchers.configure block in your test helper — and this error means that declaration is missing or the block that contains it never executed.
Source
Thrown at lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb:10
module Shoulda
module Matchers
module Integrations
module TestFrameworks
# @private
class MissingTestFramework
Integrations.register_test_framework(self, :missing_test_framework)
def validate!
raise TestFrameworkNotConfigured, <<-EOT
You need to set a test framework. Please add the following to your
test helper:
Shoulda::Matchers.configure do |config|
config.integrate do |with|
# Choose one:
with.test_framework :rspec
with.test_framework :minitest # or, :minitest_5
with.test_framework :minitest_4
with.test_framework :test_unit
end
end
EOT
end
def include(*modules, **options)
end
View on GitHub (pinned to 79cdfbc326)
Solutions
- Add the configure block shown in the error message to the helper every test loads — spec_helper.rb (or rails_helper.rb) for RSpec, test_helper.rb for minitest/Test::Unit — choosing exactly one with.test_framework line.
- Verify the file containing the block is actually required on every run: for RSpec+Rails it belongs in rails_helper.rb after require 'rspec/rails'; a block in an unloaded support file is the same as no block.
- If a block already exists, check it for the exact spelling Shoulda::Matchers.configure (plural Matchers) and confirm it contains a with.test_framework line — with.library alone is not enough, and Shoulda::Matcher.configure fails silently as an undefined method.
- After a major-version bump of shoulda-matchers, re-read the README's configuration section and diff it against your helper; 2.x configured nothing and 3.0+ requires the block.
Example fix
# before — spec_helper.rb
require 'shoulda/matchers'
# no configure block: MissingTestFramework#validate! raises TestFrameworkNotConfigured
# after
require 'shoulda/matchers'
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end Defensive patterns
Strategy: validation
Validate before calling
require 'shoulda/matchers'
framework = if defined?(RSpec)
:rspec
elsif defined?(Minitest::VERSION)
Gem::Version.new(Minitest::VERSION) >= Gem::Version.new('5.0') ? :minitest_5 : :minitest_4
end
abort 'No supported test framework loaded before shoulda-matchers' unless framework
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework framework
with.library :rails
end
end
raise 'shoulda-matchers configure block never ran' if Shoulda::Matchers.integrations.nil? Try / catch
begin
require_relative 'support/shoulda_setup'
rescue StandardError => e
if e.class.name.end_with?('TestFrameworkNotConfigured')
abort "shoulda-matchers is not configured for a test framework:\n#{e.message}"
end
raise
end Prevention
- Put the Shoulda::Matchers.configure block in the helper file every test loads (spec_helper.rb/rails_helper.rb for RSpec, test_helper.rb for minitest) — not in a support file only some suites require.
- Fail fast at boot: after loading helpers, assert Shoulda::Matchers.integrations is non-nil (it stays nil until config.integrate runs), so a silently skipped block kills CI instead of the first spec.
- After any shoulda-matchers major-version bump, re-read its configuration README; 2.x required no configure block and 3.0+ makes it mandatory.
- Spell it Shoulda::Matchers.configure (plural Matchers) and always include a with.test_framework line — with.library alone leaves the missing-framework placeholder in place.
- Detect the framework programmatically (defined?(RSpec) ? :rspec : :minitest_5) instead of hardcoding, so the block cannot drift from the frameworks the app actually loads.
When it happens
Trigger: Running the suite with shoulda-matchers required but no Shoulda::Matchers.configure block anywhere that actually executed. Writing `config.integrate { |with| with.library :rails }` with no with.test_framework line, so the seeded MissingTestFramework is still the framework being integrated. Putting the block in a helper that only some runs load (block in rails_helper.rb while the failing spec loads only spec_helper.rb, or in a support file that is never required). The gem upgrading path: shoulda-matchers 2.x needed no configure block, so a bundle update to 3.0+ makes every suite that never had one fail with this message.
Common situations: Upgrading shoulda-matchers from 2.x to 3.0+ without adding the (now mandatory) configure block — the most common hit; adding the gem to a new Rails app without pasting the initializer snippet into spec_helper/rails_helper/test_helper; a typo in the block (Shoulda::Matcher.configure, missing s) leaving a defined-but-never-run method; the block placed after or outside the files the test runner requires; CI using a different helper than local runs.
Related errors
AI-assisted analysis of thoughtbot/shoulda-matchers@79cdfbc326 (2026-08-23).
Data as JSON: /api/errors/b3a75fe99b57ca21.
Report an issue: GitHub.