Jasmine.js порівнює масиви


205

Чи є спосіб у jasmine.js перевірити, чи рівні два масиви, наприклад:

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

Ні, здається, не працює.

Відповіді:


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 (), з іншого боку, переконується, що вони точно той самий об’єкт.


Гм, спасибі, здається, що проблема полягає в тому, що масив, з яким я порівнюю, модифікується, тому він робить щось на зразок arr = [1, 2, 3] arr ['pop'] = function () {...} очікувати (arr) .toEquals ([1, 2, 3])
користувач2032804

2
як перевірити, чи рівні рівні в межах epsilon? наприклад, мій тест не відповідає очікуваним [-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; }попередньо перевіривши .
Warchinal

1
@AndyTheEntity "Функція addMatchers більше не є специфікацією (це), вона тепер є глобальним об'єктом жасмину." - див. документи Jasmine
rwisch45

for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
Андре Верланг

@warchinal смішно, воно також не вдається зловити expect([1]).toBeArray([2]). А також будь-який інший масив справді, тому щоundefined + 1 => NaN
Андре Верланг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.