Custom matchers, provided by the behavior-driven development framework Jasmine, is a great feature for testing JavaScript code. Custom Matchers helps to group multiple catch checking which makes the test cases clean and self explanatory.
Let’s look at an example that I tried recently
Here is a Calculator.js file:
1: var Calculator = function () { };
2:
3: Calculator.prototype.add = function (a, b) {
4: return a + b;
5: };
6:
7: Calculator.prototype.divide = function (a, b) {
8: return a / b;
9: };
One of the test scenarios that I would like to try is to check whether the result of the method is in a particular range. The test method will look like this with existing matchers.
1: describe('Calculator', function () {
2: var calc;
3:
4: beforeEach(function () {
5: calc = new Calculator();
6: });
7:
8: it('should be able to add 1 and 1', function () {
9: expect(calc.add(1, 1)).toBe(2);
10: });
11:
12: it('should be able to divide 6 by 2', function () {
13: expect(calc.divide(6, 2)).toBe(3);
14: })
15:
16: it('should be able to divide a rational number', function () {
17: expect(calc.divide(1, 3)).toBeLessThan(0.34);
18: expect(calc.divide(1, 3)).toBeGreaterThan(0.3);
19: })
20: });
But you can replace the existing matchers with a custom matcher like this.
1: describe('Calculator', function () {
2: var calc;
3:
4: beforeEach(function () {
5: calc = new Calculator();
6:
7: jasmine.addMatchers({
8: toBeBetween: function (util, customEqualityTesters) {
9: return {
10: compare: function (actual, a, b) {
11: var result = {};
12: result.pass = actual >= a && actual <= b;
13: return result;
14: }
15: }
16: }
17: });
18: });
19:
20: it('should be able to add 1 and 1', function () {
21: expect(calc.add(1, 1)).toBe(2);
22: });
23:
24: it('should be able to divide 6 by 2', function () {
25: expect(calc.divide(6, 2)).toBe(3);
26: })
27:
28: it('should be able to divide a rational number', function () {
29: expect(calc.divide(1, 3)).toBeBetween(0.3, 0.34);
30: })
31: });
You can reuse custom matchers to make the test cases clear and more simple.
What are some scenarios that you use custom matchers?