Skip to main content

Minitest integration

rspec-expectations is a stand-alone gem that can be used without the rest of RSpec. If you like minitest as your test runner, but prefer RSpec's approach to expressing expectations, you can have both.

To integrate rspec-expectations with minitest, require rspec/expectations/minitest_integration.

Use rspec/expectations with minitest

Given a file named "rspec_expectations_test.rb" with:

require 'minitest/autorun'
require 'rspec/expectations/minitest_integration'

class RSpecExpectationsTest < Minitest::Test
RSpec::Matchers.define :be_an_integer do
match { |actual| Integer === actual }
end

def be_an_int
# This is actually an internal rspec-expectations API, but is used
# here to demonstrate that deprecation warnings from within
# rspec-expectations work correctly without depending on rspec-core
RSpec.deprecate(:be_an_int, :replacement => :be_an_integer)
be_an_integer
end

def test_passing_expectation
expect(1 + 3).to eq 4
end

def test_failing_expectation
expect([1, 2]).to be_empty
end

def test_custom_matcher_with_deprecation_warning
expect(1).to be_an_int
end

def test_using_aggregate_failures
aggregate_failures do
expect(1).to be_even
expect(2).to be_odd
end
end
end

When I run ruby rspec_expectations_test.rb

Then the output should contain "4 runs, 5 assertions, 2 failures, 0 errors"

And the output should contain "expected [1, 2].empty? to be truthy, got false"

And the output should contain "be_an_int is deprecated"

And the output should contain "Got 2 failures from failure aggregation block".

Use rspec/expectations with minitest/spec

Given a file named "rspec_expectations_spec.rb" with:

require 'minitest/autorun'
require 'minitest/spec'
require 'rspec/expectations/minitest_integration'

describe "Using RSpec::Expectations with Minitest::Spec" do
RSpec::Matchers.define :be_an_integer do
match { |actual| Integer === actual }
end

it 'passes an expectation' do
expect(1 + 3).to eq 4
end

it 'fails an expectation' do
expect([1, 2]).to be_empty
end

it 'passes a block expectation' do
expect { 1 / 0 }.to raise_error(ZeroDivisionError)
end

it 'fails a block expectation' do
expect { 1 / 1 }.to raise_error(ZeroDivisionError)
end

it 'passes a negative expectation (using `not_to`)' do
expect(1).not_to eq 2
end

it 'fails a negative expectation (using `to_not`)' do
expect(1).to_not eq 1
end

it 'fails multiple expectations' do
aggregate_failures do
expect(1).to be_even
expect(2).to be_odd
end
end

it 'passes a minitest expectation' do
expect(1 + 3).must_equal 4
end

it 'fails a minitest expectation' do
expect([1, 2]).must_be :empty?
end
end

When I run ruby rspec_expectations_spec.rb

Then the output should contain "9 runs, 10 assertions, 5 failures, 0 errors"

And the output should contain "expected [1, 2].empty? to be truthy, got false"

And the output should contain "expected ZeroDivisionError but nothing was raised"

And the output should contain "Got 2 failures from failure aggregation block"

And the output should contain "Expected [1, 2] to be empty?".