Skip to content
vic

ryanb/mustard

Simple "must" expectations for tests and specs in Ruby.

ryanb/mustard.json
{
"createdAt": "2012-12-06T22:05:40Z",
"defaultBranch": "master",
"description": "Simple \"must\" expectations for tests and specs in Ruby.",
"fullName": "ryanb/mustard",
"homepage": "",
"language": "Ruby",
"name": "mustard",
"pushedAt": "2021-12-11T22:08:35Z",
"stargazersCount": 144,
"topics": [],
"updatedAt": "2025-08-22T10:05:01Z",
"url": "https://github.com/ryanb/mustard"
}

The Mustard gem is no longer maintained. Feel free to fork this project.

Please, pass the mustard!

An expectation library that adds “must” and “must_not” which can have matchers called on them. Comes with a default set of matchers, and additional matchers can be easily added. Works with RSpec, MiniTest, and Test::Unit. Requires Ruby 1.9 or greater.

This project is based on ideas presented in this gist. There I explain some of my issues with existing expectation interfaces.

Add this line to your application’s Gemfile and run the bundle command.

gem 'mustard', group: :test

Inside of a test or spec, call must or must_not on any object followed by a matcher. Some matchers have aliases.

5.must.equal 5
5.must_not.eq 4
5.must.be_greater_than 4
5.must.be_gt 4
[].must.be :empty? # calls the method to see if it's true
record.must.be :valid?
5.must.be :between?, 6, 7
# raises Mustard::Failure: expected 5 to be between 6 and 7
-> { 5.bad_call }.must.raise_exception(NoMethodError)

See the source code for a complete list of matchers and their behavior.

Matchers are very easy to add. If a block is passed, it will be executed in the context of the subject.

Mustard.matcher(:be_empty) { empty? }
[].must.be_empty?
[1].must.be_empty? # fail: expected [1] to be empty

Alternatively, you can pass a class to fully customize the behavior.

class BetweenMatcher
# Subject is always passed, any extra arguments will be added after
def initialize(subject, min, max)
@subject = subject
@min = min
@max = max
end
def match?
@subject.between? @min, @max
end
def failure_message
"expected #{@subject.inspect} to be between #{@min.inspect} and #{@max.inspect}."
end
def negative_failure_message
"expected #{@subject.inspect} to not be between #{@min.inspect} and #{@max.inspect}."
end
end
Mustard.matcher(:be_between, BetweenMatcher)
5.must.be_between(5, 7)

For RSpec, add this line to your spec_helper.rb if you want to disable other matchers.

config.expect_with Mustard

For MiniTest::Spec, add this line to your test_helper.rb if you want to disable existing matchers.

ENV["MT_NO_EXPECTATIONS"] = "true"
  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Make changes and ensure they pass with rspec .
  4. Commit your changes (git commit -am 'Add some feature')
  5. Push to the branch (git push origin my-new-feature)
  6. Create new Pull Request