Jasmine-Matchers
Readable tests.

Contents
- Purpose
- Installation
- Integration
- Available Matchers
- toBeArray, toHaveArray, toBeArrayOfBooleans, toHaveArrayOfBooleans, toBeArrayOfNumbers, toHaveArrayOfNumbers, toBeArrayOfObjects, toHaveArrayOfObjects, toBeArrayOfSize, toHaveArrayOfSize, toBeArrayOfStrings, toHaveArrayOfStrings, toBeEmptyArray, toHaveEmptyArray, toBeNonEmptyArray, toHaveNonEmptyArray, toBeBoolean, toHaveBoolean, toBeFalse, toHaveFalse, toBeTrue, toHaveTrue, toBeAfter, toHaveDateAfter, toBeBefore, toHaveDateBefore, toBeDate, toHaveDate, toBeIso8601, toHaveIso8601, toBeFunction, toHaveMethod, toThrowAnyError, toThrowErrorOfType, toBeCalculable, toHaveCalculable, toBeEvenNumber, toHaveEvenNumber, toBeNumber, toHaveNumber, toBeOddNumber, toHaveOddNumber, toBeWholeNumber, toHaveWholeNumber, toBeWithinRange, toHaveNumberWithinRange, toBeEmptyObject, toHaveEmptyObject, toBeNonEmptyObject, toHaveNonEmptyObject, toBeObject, toHaveObject, toHaveMember, toImplement, toBeEmptyString, toHaveEmptyString, toBeHtmlString, toHaveHtmlString, toBeJsonString, toHaveJsonString, toBeLongerThan, toHaveStringLongerThan, toBeNonEmptyString, toHaveNonEmptyString, toBeSameLengthAs, toHaveStringSameLengthAs, toBeShorterThan, toHaveStringShorterThan, toBeString, toHaveString, toBeWhitespace, toEndWith, toStartWith, toHaveWhitespaceString
- Known Supported Devices
Purpose
The Jasmine testing framework from Pivotal Labs comes with this default set of matchers;
expect(fn).toThrow(e);
expect(instance).toBe(instance);
expect(mixed).toBeDefined();
expect(mixed).toBeFalsy();
expect(number).toBeGreaterThan(number);
expect(number).toBeLessThan(number);
expect(mixed).toBeNull();
expect(mixed).toBeTruthy();
expect(mixed).toBeUndefined();
expect(array).toContain(member);
expect(string).toContain(substring);
expect(mixed).toEqual(mixed);
expect(mixed).toMatch(pattern);
Using the default Matchers your tests and failure output might look something like this;
it('should expose the expected API', function() {
expect(typeof record.save).toEqual('function');
});
Expected "undefined" to equal "function"
it('should distribute evenly', function() {
expect(basket.items % 2 === 0).toEqual(true);
});
Expected false to equal true
Using Jasmine-Matchers the same tests and failure output can be written like this;
it('should expose the expected API', function() {
expect(record).toHaveMethod('save');
});
Expected member "save" of { save : undefined } to be function.
it('should distribute evenly', function() {
expect(basket).toHaveEvenNumber('items');
});
Expected member "items" of { items : 25 } to be even number.
Installation
npm
npm install jasmine-expect --save-dev
Bower
bower install jasmine-expect --save-dev
Manual
Downloads are available on the releases page.
Integration
Browser
Include Jasmine Matchers after Jasmine but before your tests.
<script src="/path/to/jasmine-matchers.js"></script>
Karma
Integration is easy with the karma-jasmine-matchers plugin.
Node.js
When using jasmine-node 1.x, provide the path to where Jasmine Matchers is installed as the value for --requireJsSetup
.
jasmine-node --requireJsSetup node_modules/jasmine-expect/index.js test
jasmine-node 2.x has no such hooks that I'm aware of for loading helpers, in this case the following call is needed before the first test in your suite.
require('jasmine-expect');
Sublime Text
Jasmine-Matchers-Snippets can be installed with Package Control to ease development with Jasmine Matchers in Sublime Text.
Available Matchers
toBeArray
expect([]).toBeArray();
toHaveArray
expect({
memberName: []
}).toHaveArray('memberName');
toBeArrayOfBooleans
expect([true, false, true]).toBeArrayOfBooleans();
toHaveArrayOfBooleans
expect({
memberName: [true, false, true]
}).toHaveArrayOfBooleans('memberName');
toBeArrayOfNumbers
expect([12, 82, 7]).toBeArrayOfNumbers();
toHaveArrayOfNumbers
expect({
memberName: [12, 82, 7]
}).toHaveArrayOfNumbers('memberName');
toBeArrayOfObjects
expect([{}, {}]).toBeArrayOfObjects();
toHaveArrayOfObjects
expect({
memberName: [{}, {}]
}).toHaveArrayOfObjects('memberName');
toBeArrayOfSize
expect([null, 31, 'hi']).toBeArrayOfSize(3);
toHaveArrayOfSize
expect({
memberName: [null, 31, 'hi']).toBeArrayOfSi
}).toHaveArrayOfSize('memberName', size);
toBeArrayOfStrings
expect(['foo', 'bar']).toBeArrayOfStrings();
toHaveArrayOfStrings
expect({
memberName: ['foo', 'bar']
}).toHaveArrayOfStrings('memberName');
toBeEmptyArray
expect([]).toBeEmptyArray();
toHaveEmptyArray
expect({
memberName: []
}).toHaveEmptyArray('memberName');
toBeNonEmptyArray
expect([98, 'banana']).toBeNonEmptyArray();
toHaveNonEmptyArray
expect({
memberName: [98, 'banana']
}).toHaveNonEmptyArray('memberName');
toBeBoolean
expect(false).toBeBoolean();
toHaveBoolean
expect({
memberName: false
}).toHaveBoolean('memberName');
toBeFalse
expect(false).toBeFalse();
toHaveFalse
expect({
memberName: false
}).toHaveFalse('memberName');
toBeTrue
expect(true).toBeTrue();
toHaveTrue
expect({
memberName: true
}).toHaveTrue('memberName');
toBeAfter
expect(new Date('2014-01-01')).toBeAfter(new Date('1975-01-01'));
toHaveDateAfter
expect({
memberName: new Date('2014-01-01')
}).toHaveDateAfter('memberName', new Date('1975-01-01'));
toBeBefore
expect(new Date('1975-01-01')).toBeBefore(new Date('2014-01-01'));
toHaveDateBefore
expect({
memberName: new Date('1975-01-01')
}).toHaveDateBefore('memberName', new Date('2014-01-01'));
toBeDate
expect(new Date()).toBeDate();
toHaveDate
expect({
memberName: new Date()
}).toHaveDate('memberName');
toBeIso8601
expect('2013-07-08T07:29:15').toBeIso8601();
toHaveIso8601
expect({
memberName: '2013-07-08T07:29:15'
}).toHaveIso8601('memberName');
toBeFunction
expect(function() {}).toBeFunction();
toHaveMethod
expect({
memberName: function() {}
}).toHaveMethod('memberName');
toThrowAnyError
expect(function() {
return badReference.unreachable;
}).toThrowAnyError();
toThrowErrorOfType
expect(function() {
return badReference.unreachable;
}).toThrowErrorOfType(ReferenceError);
toBeCalculable
expect('12').toBeCalculable();
toHaveCalculable
expect({
memberName: '14'
}).toHaveCalculable('memberName');
toBeEvenNumber
expect(4).toBeEvenNumber();
toHaveEvenNumber
expect({
memberName: 4
}).toHaveEvenNumber('memberName');
toBeNumber
expect(66).toBeNumber();
toHaveNumber
expect({
memberName: 66
}).toHaveNumber('memberName');
toBeOddNumber
expect(3).toBeOddNumber();
toHaveOddNumber
expect({
memberName: 3
}).toHaveOddNumber('memberName');
toBeWholeNumber
expect(10).toBeWholeNumber();
toHaveWholeNumber
expect({
memberName: 10
}).toHaveWholeNumber('memberName');
toBeWithinRange
expect(6).toBeWithinRange(0, 10);
toHaveNumberWithinRange
expect({
memberName: 6
}).toHaveNumberWithinRange('memberName', 0, 10);
toBeEmptyObject
expect({}).toBeEmptyObject();
toHaveEmptyObject
expect({
memberName: {}
}).toHaveEmptyObject('memberName');
toBeNonEmptyObject
expect({
some: 'data'
}).toBeNonEmptyObject();
toHaveNonEmptyObject
expect({
memberName: {
some: 'data'
}
}).toHaveNonEmptyObject('memberName');
toBeObject
expect({}).toBeObject();
toHaveObject
expect({
memberName: {}
}).toHaveObject('memberName');
toHaveMember
expect({
memberName: undefined
}).toHaveMember('memberName');
toImplement
expect({
name: 'Clive',
age: 72
}).toImplement({
name: String,
age: Number
});
toBeEmptyString
expect('').toBeEmptyString();
toHaveEmptyString
expect({
memberName: ''
}).toHaveEmptyString('memberName');
toBeHtmlString
expect('<div></div>').toBeHtmlString();
toHaveHtmlString
expect({
memberName: '<div></div>'
}).toHaveHtmlString('memberName');
toBeJsonString
expect('{"name":"Winston"}').toBeJsonString();
toHaveJsonString
expect({
memberName: '{"name":"Winston"}'
}).toHaveJsonString('memberName');
toBeLongerThan
expect('Antidisestablishmentarianism').toBeLongerThan('No');
toHaveStringLongerThan
expect({
memberName: 'Antidisestablishmentarianism'
}).toHaveStringLongerThan('memberName', 'No');
toBeNonEmptyString
expect('filled up').toBeNonEmptyString();
toHaveNonEmptyString
expect({
memberName: 'filled up'
}).toHaveNonEmptyString('memberName');
toBeSameLengthAs
expect('Paul').toBeSameLengthAs('Jean');
toHaveStringSameLengthAs
expect({
memberName: 'Paul'
}).toHaveStringSameLengthAs('memberName', 'Jean');
toBeShorterThan
expect('No').toBeShorterThan('Antidisestablishmentarianism');
toHaveStringShorterThan
expect({
memberName: 'No'
}).toHaveStringShorterThan('memberName', 'Antidisestablishmentarianism');
toBeString
expect('').toBeString();
toHaveString
expect({
memberName: ''
}).toHaveString('memberName');
toBeWhitespace
expect(' ').toBeWhitespace();
toEndWith
expect('grandmother').toEndWith('mother');
toStartWith
expect('physiotherapy').toStartWith('physio');
toHaveWhitespaceString
expect({
memberName: ' '
}).toHaveWhitespaceString('memberName');
Known Supported Devices
During development, Jasmine-Matchers is tested against the following environments.
- Chrome 40.0.2214 (Mac OS X 10.10.1)
- Firefox 33.0.0 (Mac OS X 10.10)
- IE 7 (Windows XP on VirtualBox)
- IE 8 (Windows XP on VirtualBox)
- IE 9 (Windows 7 on VirtualBox)
- IE 10 (Windows 7 on VirtualBox)
- IE 11 (Windows 8.1 on SauceLabs)
- Opera 27.0.1689 (Mac OS X 10.10.1)
- Opera Mobile (Amazon Kindle Fire HD 8.9 on Opera Mobile Emulator)
- PhantomJS 1.9.8 (Mac OS X)
- Safari 8.0.2 (Mac OS X 10.10.1)