Custom Asymmetric Equality Testers
Jasmine provides a number of asymmetric equality testers out of the box, such
as jasmine.any() and
jasmine.objectContaining().
When it’s helpful, you can create your own custom asymmetric equality testers
to encapsulate testing logic.
To start, create a function that returns an object. The object must provide an asymmetricMatch
function.
function multipleOf(number) {
return {
/*
* The asymmetricMatch function is required, and must return a boolean.
*/
asymmetricMatch: function(compareTo) {
return compareTo % number === 0;
},
/*
* The jasmineToString method is used in the Jasmine pretty printer. Its
* return value will be seen by the user in the message when a test fails.
*/
jasmineToString: function() {
return '<multipleOf: ' + number + '>';
}
};
}
After defining your custom asymmetric equality tester, you can use it in your tests.
spyOn(Buffer, 'alloc').and.callThrough();
Buffer.alloc(2048);
expect(Buffer.alloc).toHaveBeenCalledWith(multipleOf(1024));
Just like Jasmine’s built-in asymmetric equality testers, yours can be nested inside an array or object and will work correctly.
spyOn(request, 'post');
request.post({ name: 'Jan Jansen', age: 40 });
expect(request.post).toHaveBeenCalledWith({ name: jasmine.any(String), age: multipleOf(10) });
Just like Jasmine’s built-in asymmetric equality testers, yours can be used anywhere Jasmine does an equality check.
expect(10).toEqual(multipleOf(5));
expect({ x: 3, y: 9 }).toEqual({ x: multipleOf(3), y: multipleOf(3) });