No commit activity in last 3 years
No release in over 3 years
Provides a new unversal and esily extendable matchers engine
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

 Project Readme

Most Wanted Things for Minitest

This is a little plugn for Minitest which contains a new rspec-like must/wont matchers engine, and a set of essential matchers and hooks for testing ruby/rails applications.

Usage

  1. Add gem minitest-mustwonted into your Gemfile
  2. Enjoy!

Awesome Matchers

Awesome matchers are set of easy to read logic-like matchers

describe Minitest::MustWonted do
  it "must provide awesome matchers" do
    22.must == 22
    22.wont == 33
    22.must != 22

    22.must >  11
    22.must >= 22
    22.must <= 23

    "22".must =~ /2/
    "22".wont =~ /3/
  end
end

Magick Matchers

Magick matchers are rspec like be_smth matchers

describe Minitest::MustWonted do
  it "must provide magick matchers" do
    [].must  be_empty
    [0].wont be_empty

    nil.must be_nil
    '0'.wont be_nil

    '0'.must be_a(String)
    [0].must be_an(Array)
  end
end

Collection Assertions

Additional have matcher will let you write easily readable collection checks

describe Minitest::MustWonted do
  class User
    def comments(type=nil)
      if type
        Comment.where(type: type, user: self).count
      else
        Comment.where(user: self).count
      end
    end
  end

  it "must provide collection matchers" do
    @user.must have(3).comments
    @user.must have(1).comment(:deleted)

    [1,2,3].must have(3).items
    [1    ].must have(1).item
  end
end

NOTE: calls will be automatically pluralized and resolved when possible. You also can use the item or items on plain array-like objects, in which case it will be checking the size method by default

Legacy Matchers

Most of the assert_smth | refute_smth methods are piped throught the must | wont interface automatically and resolved on fly.

describe Minitest::MustWonted do
  it "must support legacy assertions" do
    '2'.must equal(3)
    '3'.wont equal(2)

    '2'.must respond_to(:downcase)
    [2].wont respond_to(:unknown_method)
  end
end

Note, this module will automatically use your custom assert_something methods as long as they take the subject as the first argument.

Validation Matchers

MustWonted comes with a default models validation matchers similar to the minitest-matchers validation package

describe Minitest::MustWonted do
  it "must provide validation matchers" do
    @user.must have_valid(:name).with("Nikolay", "Vasilisa")
    @user.wont have_valid(:name).with(nil, '', false)
  end
end

Custom Matchers

There are two ways to define your own custom matchers. Firstly, you can just define the assert_your_own_stuff and, if needed refute_your_own_stuff methods and they will be automatically available via the must|wont interface

describe Something do
  def assert_do_my_thing(object, *args)
    # do something
  end

  it "must work right away" do
    something.must do_my_thing(arg)
  end

  # if you're gonna call 'wont' as well, then define `refutre_` too
  def refute_do_my_thing(object, *args)
    # do something
  end

  it "wont do my thing" do
    something.wont do_my_thing(arg)
  ned
end

If you wanna do something more serious, you can define your matcher as a class

class MyAwesomeMatcher
  def initialize(*args)
    @args = args
  end

  def match?(subject, wont)
    @args   # - the args you send into the matcher
    subject # - the object on which you called `must`|`wont`
    wont    # - gets `true` when you called `wont` and `false` when you called `must`

    if some_awesome_check_failed
      railse "Oh my god, we all gonna die here!"
    end
  end
end

Once you done, register your matcher with Minitest::MustWonted and start using it

Minitest::MustWonted :method_name, MyAwesomeMatcher

describe Something do
  it "must do something" do
    object.must method_name(arg, arg, arg...)
  end
end

Credits

Most ideas were boldly taken from:

Copyright

All code in this library is published under the terms of the MIT License

Copyright (C) 2013 Nikolay Nemshilov