AgentStack
SKILL verified MIT Self-run

Ruby Test Frameworks

skill-st0012-ruby-skills-ruby-test-frameworks · by st0012

Use when writing or running tests in a Ruby project that uses minitest or test-unit. These frameworks have deceptively similar APIs with critical naming differences that cause NoMethodError at runtime. Consult this before writing assertions, running specific tests, or using setup/teardown lifecycle methods.

No reviews yet
0 installs
7 views
0.0% view→install

Install

$ agentstack add skill-st0012-ruby-skills-ruby-test-frameworks

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README — it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-st0012-ruby-skills-ruby-test-frameworks)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
1mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming — see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps — measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Ruby Test Frameworks? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Minitest vs Test-Unit Divergences

Only covers where minitest and test-unit diverge. If something isn't listed here, it works the same in both.

Assertion Naming Mismatches

Using the wrong name causes NoMethodError.

| Concept | minitest | test-unit | |---------|----------|-----------| | Exception | assert_raises (plural) | assert_raise (singular) | | Throw | assert_throws (plural) | assert_throw (singular) | | Collection inclusion | assert_includes (plural) | assert_include (singular) | | Path exists | assert_path_exists (with s) | assert_path_exist (no s) | | Negation pattern | refute_* (e.g. refute_nil) | assert_not_* (e.g. assert_not_nil) |

test-unit aliases minitest names (assert_raises, refute_*, etc.), so minitest syntax works in test-unit but not vice versa.

Assertions That Only Exist in One Framework

test-unit only

| Method | Purpose | |--------|---------| | assert_nothing_raised | Passes if block doesn't raise (also added by Rails on top of minitest) | | assert_true / assert_false | Checks for exactly true or false (not just truthy/falsy) | | assert_boolean | Checks value is true or false | | assert_compare | For `, >= comparisons | | assertraisewithmessage | Checks both exception class and message | | assertraisemessage | Checks exception message only (any class) | | assertraisekindof | Checks exception via kindof? instead of exact class | | assertconstdefined / assertnotconstdefined | Check constant existence | | assertaliasmethod | Verify method aliasing | | assertnothingthrown | Passes if block doesn't call throw | | assert_block` | Passes if block returns truthy |

minitest only

| Method | Purpose | |--------|---------| | assert_pattern / refute_pattern | Ruby 3+ pattern matching (in expressions) | | assert_silent | Passes if block produces no stdout/stderr | | assert_output | Check stdout/stderr content | | capture_io / capture_subprocess_io | Capture output for inspection | | skip_until(y, m, d, msg) | Skip until a date, then fail as reminder | | fail_after(y, m, d, msg) | Pass until a date, then fail as reminder |

minitest 6 breaking change

assert_equal(nil, value) is a hard failure in minitest 6. Use assert_nil(value) instead. test-unit has no such restriction.

Test Selection (CLI Flags)

| Operation | minitest | test-unit | |-----------|----------|-----------| | By name (exact) | -n test_method_name | --name test_method_name | | By name (regex) | -n /pattern/ | --name "/pattern/" | | By name (rake) | N=/pattern/ rake test | N/A | | By line number | m test/file.rb:42 or minitest test/file.rb:42 (v6) | --location path.rb:LINE | | By line (Rails) | bin/rails test test/file.rb:42 | N/A | | Exclude by name | -e /pattern/ | --ignore-name /pattern/ | | Exclude by class | N/A | --ignore-testcase /pattern/ | | Filter by class | N/A (use -n /ClassName#/) | --testcase ClassName | | Filter by attribute | N/A | --attribute "speed == :slow" | | Seed | -s SEED or --seed SEED | N/A (use --order random) | | Stop on failure | N/A | --stop-on-failure | | Execution order | Random by default | --order alphabetic / random / defined | | Color | -p (pride) | --color-scheme SCHEME |

minitest 6 renamed -n to -i (--include). -n still works as an alias but is planned for removal.

Rails-specific flags (minitest underneath)

bin/rails test adds: -b (full backtrace), -f (fail-fast), -d (defer output), --profile [N] (slowest tests).

Lifecycle Differences

minitest

before_setup    (for frameworks like Rails)
  setup         (for test authors)
    after_setup
      [TEST]
    before_teardown
  teardown
after_teardown

No class-level hooks. No cleanup. For before(:all) / after(:all), use the minitest-hooks gem.

test-unit

startup           (class method, once before all tests)
  setup           (instance, before each test)
    [TEST]
  cleanup         (instance, only if test didn't raise)
  teardown        (instance, always runs, even if cleanup raised)
shutdown          (class method, once after all tests)

startup/shutdown have no minitest equivalent. cleanup runs after a passing test but before it's marked as passed — use it for verification like mock expectations. teardown always runs regardless of outcome — use it for resource release.

test-unit also supports registering multiple setup/teardown methods by symbol:

setup :prepare_database, :prepare_cache

Skip / Pending / Omit

| Concept | minitest | test-unit | |---------|----------|-----------| | Skip a test | skip("reason") | omit("reason") or pend("reason") | | Conditional skip | skip("reason") if condition | omit("reason") if condition or omit_if(condition, "reason") / omit_unless(condition, "reason") | | Output character | S | O (omit) or P (pend) |

Critical difference: test-unit's pend with a block fails if the block passes. This catches code that was fixed but still marked pending. minitest's skip is always unconditional.

# test-unit: this FAILS if the bug gets fixed
pend("Bug #123") do
  assert_equal(42, buggy_method)  # if this passes, test fails
end

# minitest: no equivalent behavior
skip("Bug #123")  # always skips, no block form

Output Format

| Aspect | minitest | test-unit | |--------|----------|-----------| | Progress | .FES | .FEOPN (adds Omit, Pending, Notification) | | Summary | N runs, N assertions, N failures, N errors, N skips | N tests, N assertions, N failures, N errors, N pendings, N omissions, N notifications | | Throughput | runs/s, assertions/s | tests/s, assertions/s |

test-unit Exclusive Features

These have no minitest equivalent:

  • Data-driven tests: data("label", value) method generates parameterized test runs
  • Priority system: priority :must / :important / :high / :normal / :low / :never with probabilistic execution
  • Attributes: Generic metadata on test methods, filterable via --attribute
  • sub_test_case: Named nested test groups (minitest uses describe blocks in Spec mode)
  • notify: Non-fatal informational messages shown as N in output
  • Test runners: Console, Emacs, XML (minitest only has console with plugin system)
  • Config file: ~/.test-unit.yml for persistent settings

Rails Context

Rails uses minitest, not test-unit. But Rails adds aliases and methods that blur the line:

Aliases Rails defines on top of minitest:

| Rails alias | Delegates to | Effect | |-------------|-------------|--------| | assert_not_* (12 methods) | refute_* | assert_not_nil, assert_not_equal, etc. all work in Rails | | assert_not | refute | Base negation | | assert_raise (singular) | assert_raises | Both singular and plural work in Rails | | assert_no_match | refute_match | |

Methods Rails adds (not in either framework):

| Method | Purpose | |--------|---------| | assert_nothing_raised | Passes if block doesn't raise | | assert_difference / assert_no_difference | Check numeric change after block | | assert_changes / assert_no_changes | Check value change after block |

This means in Rails: assert_not_nil, assert_raise, and assert_nothing_raised all work — but they will not work if you move the test to plain minitest outside Rails.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.