Jasmine Spy Matchers: toHaveBeenCalled(), toHaveBeenCalledWith(), toHaveBeenCalledTimes()
In this tutorial, we illustrate the workings of the toHaveBeenCalled()
, toHaveBeenCalledWith()
and toHaveBeenCalledTimes()
spy matchers.
We consider the constructor function below
function Circle() {
this.circumference = function(r) {
return 2*Math.PI*r;
}
};
toHaveBeenCalled() Matcher
The toHaveBeenCalled()
matcher verifies whether the spied method has been called or not. It returns true
if the spy was called. The following spec returns true as the method circumference()
is called
describe("The 'toHaveBeenCalled' spy matcher", function() {
it('should track that the spy was called', function() {
var c = new Circle();
spyOn(c,'circumference');
c.circumference(2);
expect(c.circumference).toHaveBeenCalled();
});
});
toHaveBeenCalledWith() Matcher
The toHaveBeenCalledWith()
matcher verifies whether the spied method has been called with the right argument(s). It returns true
if there has been any one call with the matching argument(s). In the spec below, the circumference()
method is called upon by passing the argument 2. The toHaveBeenCalledWith()
matcher returns true
and the spec passes
describe("The 'toHaveBeenCalledWith' spy matcher", function() {
it('should track the arguments of its calls', function() {
var c = new Circle();
spyOn(c,'circumference');
c.circumference(2);
expect(c.circumference).toHaveBeenCalledWith(2);
});
});
toHaveBeenCalledTimes() Matcher
The toHaveBeenCalledTimes()
matcher verifies whether the spied method has been called a specified number of times (which is passed as an argument). In the following spec, the circumference()
method is called upon once. The toHaveBeenCalledTimes()
matcher is passed the number 1
as an argument, to which it returns true
, and the spec passes.
describe("The 'toHaveBeenCalledTimes' spy matcher", function() {
it('should track the number of times the spy was called', function() {
var c = new Circle();
spyOn(c,'circumference');
c.circumference(2);
expect(c.circumference).toHaveBeenCalledTimes(1);
});
});