Jasmine-Matchers
Overview | Installation | Matchers |
Asymmetric Matchers | Integration |
Browser Support
Overview
What
A huge library of test matchers for a range of common use-cases, compatible with
all versions of Jasmine and
Jest.
Why
Custom Matchers make tests easier to read and produce relevant and useful
messages when they fail.
How
By avoiding vague messages such as "expected false to be true" in favour of
useful cues such as "expected 3 to be even number" and avoiding implementation
noise such as expect(cycleWheels % 2 === 0).toEqual(true)
in favour of simply
stating that you expect(cycleWheels).toBeEvenNumber()
.
Installation
npm
npm install jasmine-expect --save-dev
Bower
bower install jasmine-expect --save-dev
Manual
Downloads are available on the
releases page.
API
The Jasmine testing framework from
Pivotal Labs comes with this
default set of matchers:
expect(instance).toBe(instance);
expect(number).toBeCloseTo(number, decimalPlaces);
expect(mixed).toBeDefined();
expect(mixed).toBeFalsy();
expect(number).toBeGreaterThan(number);
expect(number).toBeLessThan(number);
expect(number).toBeNaN();
expect(mixed).toBeNull();
expect(mixed).toBeTruthy();
expect(mixed).toBeUndefined();
expect(array).toContain(member);
expect(mixed).toEqual(mixed);
expect(spy).toHaveBeenCalled();
expect(spy).toHaveBeenCalledTimes(number);
expect(spy).toHaveBeenCalledWith(...arguments);
expect(mixed).toMatch(pattern);
expect(fn).toThrow(string);
expect(fn).toThrowError(string);
and this
default set of asymmetric matchers;
jasmine.any(Constructor);
jasmine.anything(mixed);
jasmine.arrayContaining(mixed);
jasmine.objectContaining(mixed);
jasmine.stringMatching(pattern);
Matchers
Jasmine-Matchers adds the
following matchers:
expect(array).toBeArray();
expect(array).toBeArrayOfBooleans();
expect(array).toBeArrayOfNumbers();
expect(array).toBeArrayOfObjects();
expect(array).toBeArrayOfSize(number);
expect(array).toBeArrayOfStrings();
expect(array).toBeEmptyArray();
expect(array).toBeNonEmptyArray();
expect(boolean).toBeBoolean();
expect(boolean).toBeFalse();
expect(boolean).toBeTrue();
expect(date).toBeAfter(otherDate);
expect(date).toBeBefore(otherDate);
expect(date).toBeDate();
expect(date).toBeValidDate();
expect(fn).toBeFunction();
expect(fn).toThrowAnyError();
expect(fn).toThrowErrorOfType(constructorName);
expect(mixed).toBeCalculable();
expect(number).toBeEvenNumber();
expect(number).toBeGreaterThanOrEqualTo(otherNumber);
expect(number).toBeLessThanOrEqualTo(otherNumber);
expect(number).toBeNear(otherNumber, epsilon);
expect(number).toBeNumber();
expect(number).toBeOddNumber();
expect(number).toBeWholeNumber();
expect(number).toBeWithinRange(floor, ceiling);
expect(object).toBeEmptyObject();
expect(object).toBeNonEmptyObject();
expect(object).toBeObject();
expect(object).toHaveArray(memberName);
expect(object).toHaveArrayOfBooleans(memberName);
expect(object).toHaveArrayOfNumbers(memberName);
expect(object).toHaveArrayOfObjects(memberName);
expect(object).toHaveArrayOfSize(memberName, size);
expect(object).toHaveArrayOfStrings(memberName);
expect(object).toHaveBoolean(memberName);
expect(object).toHaveCalculable(memberName);
expect(object).toHaveDate(memberName);
expect(object).toHaveDateAfter(memberName, date);
expect(object).toHaveDateBefore(memberName, date);
expect(object).toHaveEmptyArray(memberName);
expect(object).toHaveEmptyObject(memberName);
expect(object).toHaveEmptyString(memberName);
expect(object).toHaveEvenNumber(memberName);
expect(object).toHaveFalse(memberName);
expect(object).toHaveHtmlString(memberName);
expect(object).toHaveIso8601(memberName);
expect(object).toHaveJsonString(memberName);
expect(object).toHaveMember(memberName);
expect(object).toHaveMethod(memberName);
expect(object).toHaveNonEmptyArray(memberName);
expect(object).toHaveNonEmptyObject(memberName);
expect(object).toHaveNonEmptyString(memberName);
expect(object).toHaveNumber(memberName);
expect(object).toHaveNumberWithinRange(memberName, floor, ceiling);
expect(object).toHaveObject(memberName);
expect(object).toHaveOddNumber(memberName);
expect(object).toHaveString(memberName);
expect(object).toHaveStringLongerThan(memberName, string);
expect(object).toHaveStringSameLengthAs(memberName, string);
expect(object).toHaveStringShorterThan(memberName, string);
expect(object).toHaveTrue(memberName);
expect(object).toHaveUndefined(memberName);
expect(object).toHaveWhitespaceString(memberName);
expect(object).toHaveWholeNumber(memberName);
expect(regexp).toBeRegExp();
expect(string).toBeEmptyString();
expect(string).toBeHtmlString();
expect(string).toBeIso8601();
expect(string).toBeJsonString();
expect(string).toBeLongerThan();
expect(string).toBeNonEmptyString();
expect(string).toBeSameLengthAs();
expect(string).toBeShorterThan();
expect(string).toBeString();
expect(string).toBeWhitespace();
expect(string).toEndWith(substring);
expect(string).toStartWith(substring);
Asymmetric Matchers
any.after(date);
any.arrayOfBooleans();
any.arrayOfNumbers();
any.arrayOfObjects();
any.arrayOfSize(number);
any.arrayOfStrings();
any.before(date);
any.calculable();
any.emptyArray();
any.emptyObject();
any.endingWith(string);
any.evenNumber();
any.greaterThanOrEqualTo(number);
any.iso8601();
any.jsonString();
any.lessThanOrEqualTo(number);
any.longerThan(string);
any.nonEmptyArray();
any.nonEmptyObject();
any.nonEmptyString();
any.oddNumber();
any.regExp();
any.sameLengthAs(string);
any.shorterThan(string);
any.startingWith(string);
any.whitespace();
any.wholeNumber();
any.withinRange(floor, ceiling);
Integration
Browser
Embed
jasmine-matchers.js
after Jasmine but before your tests.
Jest
Include the following in your package.json
:
"unmockedModulePathPatterns": ["jasmine-expect"]
And the following at the top of your test suite:
import JasmineExpect from 'jasmine-expect';
Karma
Integration is easy with the
karma-jasmine-matchers
plugin.
Node.js
Use the Jasmine CLI and include the
path to where Jasmine Matchers is installed in the helpers
array of your
spec/support/jasmine.json
.
{
"spec_dir": "spec",
"spec_files": ["../src/**/*.spec.js"],
"helpers": ["../node_modules/jasmine-expect/index.js"],
"stopSpecOnExpectationFailure": false,
"random": false
}
TypeScript and Angular CLI Projects
If you are using TypeScript, you might want to
npm install @types/jasmine-expect --save-dev
in order to prevent your IDE from
complaining about the new Matchers.
Also, if you run into TypeScript compilation errors when running your tests, add
"jasmine-expect"
to the "types"
array in your tests' tsconfig
file.
As an example, for an Angular CLI based project, this would be your
tsconfig.spec.json
file:
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"baseUrl": "./",
"module": "commonjs",
"target": "es5",
"types": ["jasmine", "node", "jasmine-expect"]
},
"files": ["test.ts"],
"include": ["**/*.spec.ts", "**/*.d.ts"]
}
Sublime Text
Jasmine-Matchers-Snippets
or
Jasmine-Matchers-ES6-Snippets
can be installed with
Package Control
to ease development with Jasmine Matchers in Sublime Text.
Tern
There is a Plugin for
Tern to auto-complete matchers in your Text
Editor.
Browser Support
Jasmine-Matchers is tested on
Travis CI and
BrowserStack against the following environments.
Browser | Version Range |
---|
Android | 4.0 - 5.1 |
Chrome | 26 - 52 |
Firefox | 4 - 48 |
Internet Explorer | 9 - Edge |
iOS | 6.0 - 9.3* |
Opera | 11 - 12 |
Safari | 6 - 9* |
* Safari 5.1 and iOS 5.1 are actually fully supported except for toBeIso8601
.