Jasmine: toEqual() vs toBe()
In this lesson, we take a look into the difference between the
Jasmine
toEqual() and
toBe() matchers.
We consider a JavaScript file test.js,
containing two variables a and
b, and to them we assign two equal numeric
values
var a = 1;
var b = 1;
or equal string values
var a = 'Hello';
var b = 'Hello';
or equal Boolean values
var a = true;
var b = true;
And in the spec file test.spec.js (inside
the spec directory), we write the specs in
Jasmine (below) to check the equality of
a and b, using
the toEqual()
describe("a", function() {
it("is equal to b", function() {
expect(a).toEqual(b);
});
});
and toBe() matchers respectively
describe("a", function() {
it("is equal to b", function() {
expect(a).toBe(b);
});
});
On execution, the above Jasmine specs will pass for
numbers, strings and even
Boolean values. So, for primitive values, both
toEqual() and
toBe() matchers behave the same.
But the difference can be seen in object level testing. For example,
assign the array ['1'] to both
a and b (array
is of type object)
var a = ['1'];
var b = ['1'];
On running the specs, the second test based on the
toBe() matcher will fail.
This is because the toBe() Jasmine matcher
is basically the === operator (equal value
and equal type) as can be found in the link
https://github.com/jasmine/jasmine/blob/master/src/core/matchers/toBe.js
Therefore, the expectation
expect(a).toBe(b);
can also be written as
expect(a === b).toBe(true);