Minitest::SusGuidesGetting Started

Getting Started

This guide explains how to use the minitest-sus gem to use sus fixtures within Minitest tests.

Installation

Add the gem to your project:

$ bundle add minitest-sus

Usage

A sus fixture is a plain module that exposes before, after and around hooks along with helper methods. Minitest::Sus::Context provides the small amount of glue Minitest is missing (an around chain and a mock method) so those fixtures work unchanged.

Include Minitest::Sus::Context into your test class before the fixtures. The fixtures must sit above the bridge in the ancestor chain, so ordering matters:

require "minitest/autorun"
require "minitest/sus"

require "sus/fixtures/async/reactor_context"

class MyTest < Minitest::Test
	include Minitest::Sus::Context
	include Sus::Fixtures::Async::ReactorContext
	
	def test_runs_inside_the_reactor
		# The fixture's `around` hook wraps the whole test in a reactor:
		refute_nil Async::Task.current
	end
end

The entire Minitest lifecycle (setup, the test method and teardown) runs inside the fixture's around block, so any reactor, server or client set up by the fixture is available throughout.

HTTP Server Fixture

sus-fixtures-async-http provides a server and client. It uses sus's mock API internally, which the bridge supplies, so it works without any changes:

require "minitest/autorun"
require "minitest/sus"

require "sus/fixtures/async/http/server_context"

class ServerTest < Minitest::Test
	include Minitest::Sus::Context
	include Sus::Fixtures::Async::HTTP::ServerContext
	
	def test_can_perform_a_request
		response = client.get("/")
		
		assert_equal 200, response.status
		assert_equal "Hello World!", response.read
	end
end

You can override the fixture's helper methods (e.g. app, url, protocol) just like you would in sus, by defining them in your test class:

class ApplicationTest < Minitest::Test
	include Minitest::Sus::Context
	include Sus::Fixtures::Async::HTTP::ServerContext
	
	def app
		Protocol::HTTP::Middleware.for do |request|
			Protocol::HTTP::Response[200, {}, ["Hello from my app!"]]
		end
	end
	
	def test_serves_the_application
		response = client.get("/")
		
		assert_equal "Hello from my app!", response.read
	end
end

Isolation

The bridge is opt-in per test class. Nothing about Minitest::Test is patched globally, so any test that does not include Minitest::Sus::Context is completely unaffected — no reactor is started and no hooks are installed.

Limitations

The bridge supports the fixture contract used by gems like sus-fixtures-async and sus-fixtures-async-http: module-level include, the before/after/around hooks, helper methods and mock.

It does not implement sus's class-level context DSL (include_context, shared contexts, let, it, nested describe/context), as those overlap with Minitest's own test model. Write your test methods and assertions using Minitest as usual.

When a test raises, Minitest captures the exception internally before the around chain unwinds. The fixture's after hook still runs (so cleanup such as stopping a server or reactor happens as normal), but it always receives error = nil rather than the actual exception. Fixtures that only use after for cleanup are unaffected; fixtures that need the failure itself will not receive it.