Проверка равенства объектов в 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?

4 71

4 ответа:

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

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

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"
    }));
  });
});

cf. jasmine.github.io/partial-matching

его ожидаемое поведение, так как два экземпляра объекта не совпадают в 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

для чистого теста вы должны написать свой собственный matcher, который сравнивает amount и currency:

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

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

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

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