Jest - проверить, что элемент не содержит объекта с некоторым свойством - PullRequest
1 голос
/ 18 апреля 2020

Это мой ответ, который мне нужно проверить:

[
  { _id: 'dislike', count: 1 },
  { _id: 'hate', count: 1 },
  { _id: 'trivial', count: 1 }
]

Проверить существующие значения легко:

expect(response.data).toContainEqual({ _id: 'trivial', count: 1 });
expect(response.data).toContainEqual({ _id: 'dislike', count: 1 });
expect(response.data).toContainEqual({ _id: 'hate', count: 1 });

Но мне нужно проверить, что массив не содержит объект с {_id: 'нейтральный'}. Следующий тест выглядел успешным, потому что тест прошел:

expect(response.data).not.toContain({ _id: 'neutral', count: 0 });

Но я хотел убедиться, что он выполняет то, что я ожидаю, поэтому я добавил тест, который не пройден. Но это не так:

expect(response.data).not.toContain({ _id: 'hate', count: 1 });

Вы видите? Оба теста toContainEqual и not.toContain действительны. Как я могу убедиться, что массив не содержит объект со свойством _id: 'neutral'?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Сопоставитель toContain проверяет, есть ли элемент в массиве, используя строгую проверку на равенство. Это означает, что если вы не передадите ссылку на объект, который вы пытаетесь проверить, он всегда вернет false.

Таким образом, если вы проверите:

expect(response.data).toContain({ _id: 'trivial', count: 1 });

Это не удастся потому что, хотя ваш response.data содержит объект с теми же атрибутами и значениями, это не тот же объект (он не указывает на одну и ту же ссылку).

Вот причина:

expect(response.data).not.toContain({ _id: 'neutral', count: 0 });

Всегда будет возвращать true.

Если вы хотите проверить заданную c структуру и значения, вы должны использовать toContainEqual matcher:

expect(response.data).not.toContainEqual({ _id: 'hate', count: 1 });

Кроме того, если вы хотите проверить всю структуру и значения данных вашего ответа, вы можете просто использовать toEqual matcher:

expect(response.data).toEqual([
    { _id: 'dislike', count: 1 },
    { _id: 'hate', count: 1 },
    { _id: 'trivial', count: 1 }
]);

Это проверит что response.data имеет именно ту структуру и значения, которые вы передаете в качестве параметра. Для расширения он проверяет, что он не содержит никаких других значений.

2 голосов
/ 18 апреля 2020

Вы можете сделать это с помощью Array.prototype.some()

expect(response.data.some(({_id}) => _id === "neutral")).toBe(false)

Array.prototype.some() возвращает логическое значение true, когда условие выполняется впервые, и false, если нет.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...