Low commit activity in last 3 years
Enables classic .should/.should_not syntax similar to classic RSpec on your Minitest tests.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Runtime

>= 5.0, < 7
 Project Readme

Minitest::ShouldJustWork

CI

Classic RSpec-like .should / .should_not comparisons for Minitest.

book.title.should == "Revolution"

That is the whole idea. The gem monkey-patches Object so that comparison operators after .should turn into plain Minitest assertions.

(Ouch! Monkey patch? Yes! But it only defines Object#should and #should_not.)

Requires Ruby >= 3.1. Tested against Minitest 5 and Minitest 6.

Installation

Add it to your application's Gemfile:

group :test do
  gem 'minitest-spec-rails'
  gem 'minitest-should_just_work'
end
$ bundle

Usage

require 'minitest/autorun'
require 'minitest/should_just_work'

describe "Books" do
  it "should work" do
    book = Book.new title: "Revolution"

    book.title.should == "Revolution"
  end
end

Comparisons

Minitest::ShouldJustWork Minitest::Assertions
x.should == y assert_equal y, x
x.should == nil assert_nil x
x.should != y refute_equal y, x
x.should != nil refute_nil x
x.should =~ /y/ assert_match /y/, x
x.should > y assert_operator x, :>, y
x.should < y assert_operator x, :<, y
x.should >= y assert_operator x, :>=, y
x.should <= y assert_operator x, :<=, y

Note that x.should == nil asserts nil rather than equality with nil. Minitest 5 deprecates assert_equal nil, x and Minitest 6 fails it outright, so this is the only spelling that can work.

Negating

Use should_not, or should.not, to turn any comparison into its refute_:

  obj.should_not == 3                # => refute_equal 3, obj
  obj.should_not =~ /regex/          # => refute_match /regex/, obj
  obj.should_not == nil              # => refute_nil obj

Exceptions and throws

  should.raise ZeroDivisionError do
    2 / 0
  end

  should_not.raise ZeroDivisionError do
    2 / 1
  end

  should.throw(:done) { throw :done }
  should_not.throw(:done) { keep_going }

should.raise with no argument catches StandardError.

RuboCop

obj.should == 2 is a statement whose value is discarded, and obj.should == nil compares against nil on purpose. Three cops object to exactly that, so switch them off for your tests:

Lint/Void:
  Exclude:
    - test/**/*
Style/NilComparison:
  Exclude:
    - test/**/*
Style/NonNilCheck:
  Exclude:
    - test/**/*

Ruby's own -w will also report "useless use of == in void context" for every line, so leave warnings off for your test task.

Development

$ bin/setup
$ bundle exec rake        # tests and RuboCop

To run the suite against a particular Minitest line:

$ MINITEST_VERSION="~> 5.0" bundle install && MINITEST_VERSION="~> 5.0" bundle exec rake test

Acknowledgements & licensing

Inspired by the minitest-should_syntax gem.

(c) 2022-2026 Priit Tark, MIT license (c) 2013 Rico Sta. Cruz, MIT license