Допустим, у меня есть следующее:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
Оба вышеуказанных теста пройдут. Есть ли разница между toBe()
и toEqual()
когда дело доходит до оценки чисел? Если так, когда я должен использовать один, а не другой?
javascript
jasmine
Ллойд Бэнкс
источник
источник
toEqual()
будет сравнивать по ключу / значениям-контенту;toBe()
будет сравнивать по ссылке на объект.Ответы:
Для примитивных типов (например, числа, логические значения, строки и т. Д.) Нет разницы между
toBe
иtoEqual
; либо один будет работать5
,true
или"the cake is a lie"
.Чтобы понять разницу между
toBe
иtoEqual
, давайте представим три объекта.Используя строгое сравнение (
===
), некоторые вещи "одинаковы":Но некоторые вещи, даже если они «равны», не являются «одинаковыми», поскольку они представляют объекты, которые живут в разных местах памяти.
toBe
Мэтчер Жасмин - не более чем обертка для строгого сравнения на равенствоэто то же самое, что
Не просто поверьте мне на слово; см. исходный код для toBe .
Но
b
иc
представляют функционально эквивалентные объекты; они оба похожиРазве не было бы замечательно, если бы мы могли сказать это
b
иc
быть «равными», даже если они не представляют один и тот же объект?Enter
toEqual
, который проверяет «глубокое равенство» (т. Е. Выполняет рекурсивный поиск по объектам, чтобы определить, эквивалентны ли значения их ключей). Оба следующих теста пройдут:Надеюсь, что это поможет прояснить некоторые вещи.
источник
expect(0).toBe(-0)
пройдет, но неexpect(0).toEqual(-0)
получится.toBe
использует строгое равенство - сравнивает по ссылке,toEqual
использует свойство эквивалентности. Рекомендуется использоватьtoEqual
для примитивовtoEqual
гораздо более осторожными относительно равенства (0 != -0
,"hi" = new String("hi")
и т.д.), так что я бы рекомендовал использоватьtoEqual
только , если вы на самом деле обеспокоены эталонной эквивалентности. Просмотреть все проверкиtoEqual
вeq
методе можно здесь: github.com/jasmine/jasmine/blob/master/src/core/matchers/….toBe()
противtoEqual()
:toEqual()
проверяет эквивалентность.toBe()
, с другой стороны, удостоверяется, что это точно такой же объект.Я бы сказал, использовать
toBe()
при сравнении значений, иtoEqual()
при сравнении объектов.При сравнении типов примитивов
toEqual()
иtoBe()
даст тот же результат. При сравнении объектовtoBe()
выполняется более строгое сравнение, и, если это не тот же самый объект в памяти, он возвращает false. Поэтому, если вы не хотите убедиться, что это точно такой же объект в памяти, используйтеtoEqual()
для сравнения объектов.Проверьте эту ссылку для получения дополнительной информации: http://evanhahn.com/how-do-i-jasmine/
Теперь, когда вы смотрите на разницу между числами
toBe()
иtoEqual()
когда дело доходит до цифр, не должно быть никакой разницы, если вы сравниваете их правильно.5
всегда будет эквивалентна5
.Хорошее место, чтобы поиграть с этим, чтобы увидеть разные результаты здесь
Обновить
Простой способ взглянуть на это
toBe()
иtoEqual()
понять, что именно они делают в JavaScript. Согласно Jasmine API, найдены здесь :По сути, это то, что говорит
toEqual()
иtoBe()
является похожим===
оператором Javascripts, за исключениемtoBe()
того, что он также проверяет, чтобы убедиться, что это точно такой же объект, как и в примере нижеobjectOne === objectTwo //returns false
. ОднакоtoEqual()
вернется правда в этой ситуации.Теперь вы можете, по крайней мере, понять, почему, когда дано:
expect(objectOne).toBe(objectTwo); //returns false
Это происходит потому , что, как указано в этом ответе на другой, но подобный вопрос,
===
оператор на самом деле означает , что оба операнд ссылается на тот же объект, или в случае типов значений, имеет одинаковое значение.источник
toEqual()
значит,toEqual()
проверяя эквивалентность , но следующий очевидный вопрос - хорошо, так что же означает «эквивалент»? Описание алгоритма, использованного для определения «эквивалентности», или, по крайней мере, примеры случаев, когда поведениеtoEqual()
иtoBe()
отличается, сделало бы это более полезным.toEqual
следует использовать для глубокого сравнения объектов, а неtoBe
. jsfiddle.net/bBL9P/67toEqual
это совсем не то же самое, что==
.expect(1).toEqual('1')
не получается, пока1 == '1'
верно.toEqual
не имеет ничего общего с==
. Это как===
за исключением того, что он будет сравнивать объекты способом, аналогичным сравнению по значению.Процитирую проект Jasmine Github,
источник
Взгляд на исходный код Jasmine проливает больше света на эту проблему.
toBe
очень прост и использует только оператор тождества / строгого равенства===
:toEqual
, С другой стороны, имеет длину около 150 строк и имеет специальную обработку для встраиваемых объектов , таких какString
,Number
,Boolean
,Date
,Error
,Element
иRegExp
. Для других объектов он рекурсивно сравнивает свойства.Это сильно отличается от поведения оператора равенства
==
. Например:источник
toEqual()
сравнивает значения, если Primitive или содержимое, если Objects.toBe()
сравнивает ссылки.Следующий код / пакет должен быть понятен:
источник
Мысль кому-то может понравиться объяснение на (аннотированный) пример:
Ниже, если моя функция deepClone () выполняет свою работу правильно, тест (как описано в вызове 'it ()') будет успешным:
Конечно, это не полный набор тестов для моего deepClone (), поскольку я здесь не проверял, имеют ли литерал объекта в массиве (и вложенный в него) также различную идентичность, но одинаковые значения.
источник
Я думаю, что toEqual проверяет глубокое равенство, toBe является той же ссылкой 2 переменной
источник
Примечания к сведению:
toBe()
лечит сравнения нравится , какObject.is()
делает.toEqual()
лечит сравнения нравится , как===
делает.Вот почему для примитивных типов,
toBe
иtoEqual
не имеют большого значения при проверке равенства, но и для ссылочных типов , таких как объекты, вы предпочли бы использоватьtoEqual
для проверки равенства.источник