Ruby's minitest assertions, now available to JavaScript, ready to be consumed with mocha (or another test runner). Rubyists must feel at home, and everybody should have clean and readable tests, running in a large spectrum of engines.

Quick Start

Assuming we'd like to test this object:

var Meme = function () {};

Meme.prototype = {
  i_can_has_cheezburger: function () {
    return "OHAI!";
  },

  will_it_blend: function () {
    return "YES!";
  }
};

Unit

var assert = require("minitest").assert;
var refute = require("minitest").refute;

var meme = new Meme();
assert.equal("OHAI!", meme.i_can_has_cheezburger());
refute.match(/^no/i, meme.will_it_blend());

Spec

require("minitest/spec");

var meme = new Meme();
meme.i_can_has_cheezburger().mustEqual("OHAI!");
meme.will_it_blend().wontMatch(/^no/i);

Expect

var expect = require("minitest").expect;

var meme = new Meme();
expect(meme.i_can_has_cheezburger()).toEqual("OHAI!");
expect(meme.will_it_blend()).toNotMatch(/^no/i);

Mock

require("minitest/spec");
var Mock = require("minitest/mock");

var MemeAsker = function (meme) {
  this.meme = meme;
};
MemeAsker.prototype.ask = function (question) {
  var method = question.replace(/ /g, "_");
  return this.meme[method];
};

var meme = new Mock();
var memeAsker = new MemeAsker(meme);

meme.expect("will_it_blend", "NO!");
memeAsker.ask("will it blend").mustEqual("NO!");
meme.verify();

Stub

var assert = require("minitest").assert;
require("minitest/stub");

var meme = new Meme();
meme.stub("will_it_blend", "NO!", function () {
  assert.equal("NO!", meme.will_it_blend());
});

// stub goes away once the callback is done
assert.equal("YES!", meme.will_it_blend());

Promises

require('minitest/promised');
var assert = require("minitest").assert;

var deferred = Q.defer();
assert.equal("YES!", deferred.promise);
deferred.resolve("YES!");

// we can still use normal assertions
assert(true);

About

Minitest.js focuses on the tests: assertions, expectations (seamlessly built on the assertions) and mocks; and leaves alone the suite and runner parts, because there are some great solutions already for running tests in JavaScript, like mocha.

The assertions should be a direct port of their ruby counterparts, but modified to cope with javascript's weirdness, and thus somehow conform to the CommonJS Unit Testing/1.0 test suite (eg: deep equality).

Install

# Node
npm install git://github.com/ysbaddaden/minitest-js.git

# Bower
bower install minitest

Browser Support

Minitest.js assumes that your browser support ECMAScript 5, either natively or through a polyfill and can be used in any browser, back to Internet Explorer 6.

Spec expectations (eg: mustEqual), on the other end, do require native support for Object.defineProperty, which restrict support to modern engines only (eg: Node.js, Internet Explorer 10+, Firefox 12+, etc). But thanks to a little hack, we can support Firefox 3.6 and Internet Explorer 9 (unless we find another bug).