Проверка равенства объектов в Jasmine

85

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?

Дэн
источник

Ответы:

172

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

lukas.pukenis
источник
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;
    }
  });
});
Андреас Кёберле
источник
2

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

expect(_.isEqual(result, expectedResult)).toBeTruthy()
Александр Поштарук
источник
-4

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

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

expect(money1.sum() == money2.sum()).toBeTruthy();
Баер
источник
9
То , что вы сказали о ==и ===совершенно неправильно. Два разных экземпляра объекта с одинаковым содержимым вернут false. Для любого не-примитивов, ==и ===ведут себя одинаково. jsfiddle.net/9mrmyrs6
Хуан Мендес
@JuanMendes, посмотрите ответ Андреаса К. ... вы, ребята, говорите две разные вещи. Разве это разница в обновлении объекта и литерала объекта?
pherris
@pherris mmm .... да, мы говорим разные вещи: я говорю, что при сравнении непримитивов не имеет значения, используете ли вы ==или ===, никакого принуждения нет. Андреас говорит, что вы можете создать собственный сопоставитель. Последнее утверждение о том, как решить эту проблему, является «правильным», но объяснение в первом абзаце просто неверно. jasmineбудет фактически проверять содержимое объекта, если вы используете toBe()вместоequals
Хуан Мендес
a == bвсе равно будет давать ложные , если aи bразные случаи, вы можете изменить свой ответ
Louie Almeda