Сравниваемые значения не имеют визуального различия с шуткой - PullRequest
0 голосов
/ 15 января 2020

У меня проблема с модульным тестом Jest / Chai.

enter image description here

Как вы можете видеть, я получил тот же вывод, но тест не прошел с сообщение: «сравниваемые значения не имеют визуальной разницы». Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Это часто встречается в javascript. Как вы, наверное, уже знаете, массив является объектом, поэтому я бы объяснил, используя объекты.

TLDR: Переменная, присвоенная объекту, является только указателем на такое значение в памяти. Следовательно, две переменные невозможно, несмотря на то, что разные объекты, содержащие одно и то же ФИЗИЧЕСКОЕ значение, но не ссылающиеся на один и тот же адрес в памяти, равны.

Javascript сравнивает объекты по тождественности, что означает, что для случая объекты a и b ниже: Пример 1:

a = {name: 'tolumide'}

b = {name: 'tolumide'} 

a === b // False
a !== b //True

Хотя a и b имеют одинаковое содержимое, идентичность здесь отличается, поэтому => a !== b //True

Однако это отличается от примера 2 ниже: Пример 2:

c = {name: 'tolumide'}
c = d
c === d // True
c !== d // False

Это потому, что c и d относятся к одному и тому же значению в памяти.

Что вам нужно для тестирования в шутка будет примерно такой:

const expected = ['Alice', 'Bob', 'Eve']
expect.arrayContaining(array)
expect(['Alice', 'Bob', 'Eve']).toEqual(expect.arrayContaining(expected));

OR 
const shoppingList = ['beer', 'whiskey']
expect(shoppingList).toContain('beer');

источник шутки

1 голос
/ 15 января 2020

Простите, если я излагаю все, что вы уже знаете, но проблема, по-видимому, заключается в сравнении базовых объектов, выполняемых jest.

Массивы в javascript - это просто объекты с пронумерованными свойствами, т.е.

{
   0: "value at first index",
   1: "value at second index"
}

Таким образом, сравнение выполняется для этого базового объекта. В соответствии с этой проблемой, поднятой кем-то на странице jest github, возможно, что функция, которую вы используете для создания отсортированного массива, возвращает не стандартный массив, поэтому сравнение не удается выполнить для базового объекта.

Аналогичная проблема: https://github.com/facebook/jest/issues/5998

Решение, предложенное одним комментатором, состоит в том, чтобы Json.Stringify() каждый массив в тесте и сравнение с ним, поскольку при этом будут сравниваться значения сами по себе.

Это, однако, как указано "Обход, а не исправление".

Редактировать Опция stringify работает не во всех случаях и ее следует избегать.

Полное решение для проверки, если два массива равны, находится в первом ответе на этот вопрос: Как проверить, равны ли два массива JavaScript?

Отказ от ответственности : Не мой код!

function arraysEqual(a, b) {
  if (a === b) return true;
  if (a == null || b == null) return false;
  if (a.length != b.length) return false;

  // If you don't care about the order of the elements inside
  // the array (i.e. [1, 2, 3] == [3, 2, 1]), you should sort both arrays here.
  // Please note that calling sort on an array will modify that array.
  // you might want to clone your array first.

  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...