Перевірка рівності об’єктів у жасмині


85

Жасмін має вбудовані збіги toBeта toEqual. Якщо у мене є такий об’єкт:

function Money(amount, currency){
    this.amount = amount;
    this.currency = currency;

    this.sum = function (money){
        return new Money(200, "USD");
    }
}

і спробуйте порівняти new Money(200, "USD")та результат суми, ці вбудовані збіги не працюватимуть належним чином. Мені вдалося здійснити обхід на основі власного equalsметоду та спеціального збігу, але це, здається, багато працює.

Який стандартний спосіб порівняння об’єктів у Жасмині?

Відповіді:


172

Я шукав те саме, і знайшов існуючий спосіб зробити це без будь-якого спеціального коду або збігів. Використовуйте toEqual().


63

Якщо ви хочете порівняти часткові об’єкти, ви можете розглянути:

describe("jasmine.objectContaining", function() {
  var foo;

  beforeEach(function() {
    foo = {
      a: 1,
      b: 2,
      bar: "baz"
    };
  });

  it("matches objects with the expect key/value pairs", function() {
    expect(foo).toEqual(jasmine.objectContaining({
      bar: "baz"
    }));
  });
});

пор. jasmine.github.io/partial-matching


3

Це очікувана поведінка, оскільки два екземпляри об’єкта не однакові в JavaScript.

function Money(amount, currency){
  this.amount = amount;
  this.currency = currency;

  this.sum = function (money){
    return new Money(200, "USD");
  }
}

var a = new Money(200, "USD")
var b = a.sum();

console.log(a == b) //false
console.log(a === b) //false

Для чистого тесту ви повинні написати свій власний матч, який порівнює amountта currency:

beforeEach(function() {
  this.addMatchers({
    sameAmountOfMoney: function(expected) {
      return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
    }
  });
});


-4

Ваша проблема в істинності. Ви намагаєтеся порівняти два різні екземпляри об'єкта, що відповідає дійсності для регулярної рівності (a == b), але не відповідає суворій рівності (a === b). Компаратором, який використовує жасмин, є jasmine.Env.equals_ (), який шукає суворої рівності.

Щоб виконати те, що вам потрібно, не змінюючи свій код, ви можете використовувати звичайну рівність, перевіряючи істинність чимось подібним до наступного:

expect(money1.sum() == money2.sum()).toBeTruthy();

9
Те, про що ви сказали, ==і ===є абсолютно неправильним. Два різні екземпляри об’єкта з однаковим вмістом повернуть значення false. Для будь-яких примітивів ==і ===поводитись однаково. jsfiddle.net/9mrmyrs6
Хуан Мендес

@JuanMendes перевірте відповідь Андреаса К. ... ви, хлопці, говорите дві різні речі. Це різниця в новому об’єкті в порівнянні з літералом об’єкта?
Ферріс

@pherris mmm .... так, ми говоримо різні речі: я кажу, що, порівнюючи непримітивні, неважливо, чи використовуєте ви, ==чи ===не застосовується примус. Андреас каже, що ви можете створити власний матч. Останнє твердження про те, як вирішити цю проблему, є "правильним", але пояснення в першому абзаці просто неправильне. jasmineфактично перевірить вміст об’єкта, якщо ви використовуєте toBe()замість ньогоequals
Хуан Мендес,

a == bвсе одно даватиме значення false, якщо aі bє різні випадки, можливо, ви захочете відредагувати свою відповідь
Louie Almeda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.