Jasmine.js comparing arrays

Jasmine.js comparing arrays

Is there a way in jasmine.js to check if two arrays are equal, for example:
arr = [1, 2, 3]
expect(arr).toBe([1, 2, 3])
expect(arr).toEqual([1, 2, 3])

Neither seems to work.


Solution 1:

Just did the test and it works with toEqual

please find my test:


describe('toEqual', function() {
    it('passes if arrays are equal', function() {
        var arr = [1, 2, 3];
        expect(arr).toEqual([1, 2, 3]);

Just for information:

toBe() versus toEqual(): toEqual() checks equivalence. toBe(), on the
other hand, makes sure that they’re the exact same object.

Solution 2:

I had a similar issue where one of the arrays was modified. I was using it for $httpBackend, and the returned object from that was actually a $promise object containing the array (not an Array object).

You can create a jasmine matcher to match the array by creating a toBeArray function:

beforeEach(function() {
  'use strict';
    toBeArray: function(array) {
      this.message = function() {
        return "Expected " + angular.mock.dump(this.actual) + " to be array " + angular.mock.dump(array) + ".";
      var arraysAreSame = function(x, y) {
         var arraysAreSame = true;
         for(var i; i < x.length; i++)
            if(x[i] !== y[i])
               arraysAreSame = false;
         return arraysAreSame;
      return arraysAreSame(this.actual, array);

And then just use it in your tests like the other jasmine matchers:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */

Solution 3:

just for the record you can always compare using JSON.stringify

Related:  AngularJS - UI Router - programmatically add states

const arr = [1,2,3];

It’s all meter of taste,
this will also work for complex literal objects