Сравните два разных объекта с jasmine .toEqual, и один объект пуст, а другой имеет ключ, который является символом. Почему он говорит, что они равны? - PullRequest
2 голосов
/ 21 января 2020

Вот мое ожидание:

const otherObject = { [Symbol('what')]: { key: 'value' } };
expect({}).toEqual(otherObject); // succeeds

Ожидается, что тест провалится.

Почему Жасмин сообщает, что этот тест прошел успешно? Я использую jasmine@3.5

Вот коды и поля https://codesandbox.io/s/floral-platform-rceq0

1 Ответ

1 голос
/ 08 февраля 2020

В настоящее время он просто не будет работать, используя Symbol в качестве ключа. Когда jasmine выполняет сравнение, он пытается получить keys объекта, см. jasmine.js # L4551 , функция, используемая для извлечения ключей, использует Object.keys, см. jasmine.js # L4587 .

См. Следующий пример

const otherObject = { [Symbol('what')]: { key: 'value' } };
console.log(Object.keys(otherObject)); // ouput []

Итак, когда jasmine запускает сравнение expect({}).toEqual(otherObject);, оно сравнивается, если {} с использованием сравнения глубокого равенства равно {}, и это true, это буквально сравнивает два пустых объекта.

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

const mySymbol = Symbol('what');
const otherObject = { [mySymbol]: { key: 'value' } };
expect(otherObject).toEqual(
  jasmine.objectContaining({ [mySymbol]: { key: 'value2' } })
);

Итак, Вы можете выполнить итерацию вашего объекта, используя Object.getOwnPropertySymbols и написать ожидание для каждого значения.

Или вы можете открыть запрос на добавление команды Jasmine, чтобы они рассмотрели проверку Symbols, а не только ключи.

https://github.com/jasmine/jasmine/issues

Надеюсь, это поможет

...