Как toEqual () в jest интерпретируется для неизменных объектов? - PullRequest
0 голосов
/ 25 марта 2019

Я ожидаю, что оба эти toEqual() теста пройдут.Первый проходит, а второй нет.Почему?

test('something', () => {
  const m = Map({
    a: 1,
    b: 2,
  })

  expect(m.valueSeq()).toEqual(m.valueSeq());
  expect(m.valueSeq().filter(_ => true)).toEqual(m.valueSeq());
});

1 Ответ

0 голосов
/ 25 марта 2019

Эта строка:

expect(m.valueSeq().filter(_ => true)).toEqual(m.valueSeq());

... звонит toEqual , который звонит equal, передавая iterableEquality в качестве пользовательского сопоставителя:

const pass = equals(received, expected, [iterableEquality]);

iterableEquality возвращает false на эту строку :

if (a.constructor !== b.constructor) {
  return false;
}

... потому что конструкторы не равны:

const { Map } = require('immutable');

test('something', () => {
  const m = Map({
    a: 1,
    b: 2,
  })

  const seq = m.valueSeq();
  const filter = m.valueSeq().filter(_ => true);

  console.log(seq.constructor);  // [Function: ToIndexedSequence]
  console.log(filter.constructor);  // [Function: IndexedCollection]

  expect(seq.constructor).not.toBe(filter.constructor); // Success! (different constructors)
});
...