RuboCop Minitest
A RuboCop extension focused on enforcing Minitest best practices and coding conventions. The library is based on the guidelines outlined in the community Minitest Style Guide.
Installation
Just install the rubocop-minitest gem
$ gem install rubocop-minitest
or if you use bundler put this in your Gemfile
gem 'rubocop-minitest', require: false
Usage
You need to tell RuboCop to load the Minitest extension. There are three ways to do this:
RuboCop configuration file
Put this into your .rubocop.yml.
plugins: rubocop-minitest
Alternatively, use the following array notation when specifying multiple extensions.
plugins:
- rubocop-other-extension
- rubocop-minitest
Now you can run rubocop and it will automatically load the RuboCop Minitest
cops together with the standard cops.
[!NOTE] The plugin system is supported in RuboCop 1.72+. In earlier versions, use
requireinstead ofplugins.
Command line
$ rubocop --plugin rubocop-minitest
Rake task
require 'rubocop/rake_task'
RuboCop::RakeTask.new do |task|
task.plugins << 'rubocop-minitest'
end
The Cops
All cops are located under
lib/rubocop/cop/minitest, and contain
examples/documentation. The documentation is published here.
In your .rubocop.yml, you may treat the Minitest cops just like any other
cop. For example:
Minitest/AssertNil:
Exclude:
- test/my_file_to_ignore_test.rb
Testing your own cops
This gem provides RuboCop::TestCase, a base test case class for testing custom cops with Minitest.
Require rubocop/minitest/support in your test helper, then inherit from RuboCop::TestCase to get
the assert_offense, assert_correction, assert_no_corrections, and assert_no_offenses assertions:
require 'rubocop/minitest/support'
module CustomCops
class MyCopTest < RuboCop::TestCase
def test_registers_offense
assert_offense(<<~RUBY)
bad_method
^^^^^^^^^^ Use `good_method` instead of `bad_method`.
RUBY
assert_correction(<<~RUBY)
good_method
RUBY
end
def test_does_not_register_offense
assert_no_offenses(<<~RUBY)
good_method
RUBY
end
end
end
The cop under test is derived from the test class name: CustomCops::MyCopTest resolves
CustomCops::MyCop, then RuboCop::Cop::Minitest::MyCop. Define a cop_class method in
the test class to specify the cop explicitly:
class MyCopTest < RuboCop::TestCase
private
def cop_class
CustomCops::MyCop
end
end
The configuration for the cop under test and the target Ruby version can be specified
by overriding cop_config, other_cops, or target_ruby_version in the test class:
class MyCopTest < RuboCop::TestCase
private
def cop_config
{ 'Max' => 1 }
end
def target_ruby_version
3.0
end
end
To change them for a single test, assign them in the test method. This makes it possible for tests targeting different Ruby versions to live in the same test class:
class MyCopTest < RuboCop::TestCase
def test_registers_offense_on_ruby31
self.target_ruby_version = 3.1
assert_offense(<<~RUBY)
bad_method
^^^^^^^^^^ Use `good_method` instead of `bad_method`.
RUBY
end
def test_does_not_register_offense_on_ruby30
self.target_ruby_version = 3.0
assert_no_offenses(<<~RUBY)
bad_method
RUBY
end
end
The default configuration of extensions registered as lint_roller plugins
is applied automatically. For other extensions, call RuboCop::ConfigLoader.inject_defaults!('path/to/default.yml')
in your test helper.
Documentation
You can read a lot more about RuboCop Minitest in its official docs.
Readme Badge
If you use RuboCop Minitest in your project, you can include one of these badges in your readme to let people know that your code is written following the community Minitest Style Guide.
Here are the Markdown snippets for the two badges:
[](https://github.com/rubocop/rubocop-minitest)
[](https://minitest.rubystyle.guide)
Contributing
Checkout the contribution guidelines.
License
rubocop-minitest is MIT licensed. See the accompanying file for
the full text.