Подтвердить что ты не робот

Проверка равенства объектов в Жасмине

Jasmine имеет встроенные совпадения 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 и пользовательском совпадении, но это, похоже, очень много работает.

Каков стандартный способ сравнения объектов в Jasmine?

4b9b3361

Ответ 1

Я искал то же самое и нашел существующий способ сделать это без каких-либо пользовательских кодов или шаблонов. Используйте toEqual().

Ответ 2

Если вы хотите сравнить частичные объекты, вы можете подумать:

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

Я обнаружил, что lodash _.isEqual хорош для этого

expect(_.isEqual(result, expectedResult)).toBeTruthy()

Ответ 5

Ваша проблема в правдивости. Вы пытаетесь сравнить два разных экземпляра объекта, который является истинным для правильного равенства (a == b), но не соответствует строгому равенству (a === b). Компаратор, который использует жасмин, jasmine.Env.equals_(), который ищет строгое равенство.

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

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