Jasmine.js, сравнивающий массивы

205

Есть ли способ в jasmine.js проверить, равны ли два массива, например:

arr = [1, 2, 3]
expect(arr).toBe([1, 2, 3])
expect(arr).toEqual([1, 2, 3])

Ни то, ни другое не работает.

user2032804
источник

Ответы:

341

Только что сделал тест, и он работает с toEqual

пожалуйста, найдите мой тест:

http://jsfiddle.net/7q9N7/3/

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

Просто для информации:

toBe () и toEqual (): toEqual () проверяет эквивалентность. toBe (), с другой стороны, гарантирует, что это точно такой же объект.

TheEwook
источник
Хм, спасибо, похоже, проблема в том, что массив, с которым я сравниваю, модифицирован, поэтому он делает что-то вроде arr = [1, 2, 3] arr ['pop'] = function () {...} Ожидайте (обр.) .toEquals ([1, 2, 3])
user2032804
2
как проверить, равны ли значения в эпсилоне? Например, мой тест не пройден Ожидаемый [-9, -6, 6, 3, 1.0000000000000004, 2] равен [-9, -6, 6, 3, 1, 2].
Морфеус
@ morpheus - я пытался, toBeCloseTo(expected,2)но это не сработало.
cod3monk3y
второй аргумент toBeCloseTo - это количество десятичных разрядов, с которым он будет сравниваться.
Морфеус
1
это возвращается к "==" в javascript по умолчанию. Это просто небезопасно, поскольку сравниваются не только фактические значения, но и весь объект.
Питер
0

Вы можете сравнить массив, как указано ниже, если массив имеет некоторые значения

it('should check if the array are equal', function() {
        var mockArr = [1, 2, 3];
        expect(mockArr ).toEqual([1, 2, 3]);
 });

Но если массив, возвращаемый какой-либо функцией, содержит более 1 элемента, и все они равны нулю, то проверьте с помощью

expect(mockArray[0]).toBe(0);
Уткарш Джоши
источник
-3

просто для записи вы всегда можете сравнить, используя JSON.stringify

const arr = [1,2,3]; expect(JSON.stringify(arr)).toBe(JSON.stringify([1,2,3])); expect(JSON.stringify(arr)).toEqual(JSON.stringify([1,2,3]));

Это все метра вкуса, это также будет работать для сложных буквальных объектов

Охад Садан
источник
зачем тогда нужна разница между toBe и toEqual?
Лука Боррионе
нет никакой разницы, я просто хотел, чтобы это выглядело как вопрос
Охад Садан
Существует разница между toBe и toEqual, в которой OP не был уверен. Ответ должен прояснить ситуацию, а не показывать неправильное использование. Принятый ответ уже содержит все, ваш ответ потенциально вводит больше путаницы, показывающей, как заставить жасмин работать так, как он не предназначен для работы.
Лука Боррионе
-4

У меня была похожая проблема, когда один из массивов был изменен. Я использовал его для $httpBackend, и возвращенный объект из этого был на самом деле $promiseобъект, содержащий массив (неArray объект).

Вы можете создать совпадение с жасмином, чтобы соответствовать массиву, создав toBeArrayфункцию:

beforeEach(function() {
  'use strict';
  this.addMatchers({
    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);
    }
  });
});

А затем просто используйте его в своих тестах, как и другие жасминовые сопоставители:

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});
антивещество
источник
2
Я получаю TypeError: this.addMatchers не является функцией
AndyTheEntity
4
Предоставленная вами функция «arraysAreSame» выдаст ложное срабатывание для массивов x=[1,2], y=[1,2,3]поскольку она проверяет только первые x.lengthэлементы. Вы можете исправить это, проверив if (x.length !== y.length) { return false; }заранее.
1533 года
1
@AndyTheEntity "Функция addMatchers больше не соответствует спецификации (это), теперь она включена в глобальный объект жасмин." - видеть документацию по Жасмин
rwisch45
for (var i; ...) => x[undefined] , var arraysAreSame = function ... var arraysAreSame = true:(
Андре Верланг
@warchinal забавно, это также не в состоянии поймать expect([1]).toBeArray([2]). А также любой другой массив действительно, потому чтоundefined + 1 => NaN
Андре Верланг