Матчеры для объектов

Jest предоставляет множество встроенных матчеров, которые позволяют выполнять проверки различных типов значений. В этом разделе рассматриваются матчеры, предназначенные для проверки объектов. Объекты в JavaScript — это структуры данных, содержащие набор пар «ключ-значение», и зачастую их проверка требует особого подхода, чтобы удостовериться в правильности как ключей, так и значений.

Основные матчеры для объектов

toBe

М matcher toBe проверяет, равны ли два объекта. Однако для объектов важно понимать, что toBe использует операторы строгого сравнения (===), что означает, что при сравнении объектов проверяется не их содержимое, а ссылки на них в памяти. Таким образом, два различных объекта с одинаковыми значениями не будут равны, даже если их свойства идентичны.

Пример:

const obj1 = { name: 'John', age: 30 };
const obj2 = { name: 'John', age: 30 };
test('objects are not the same reference', () => {
  expect(obj1).not.toBe(obj2); // Объекты разные, так как они находятся по разным ссылкам
});

Для сравнения содержимого объектов следует использовать другие матчеры.

toEqual

Мatcher toEqual сравнивает объекты по их содержимому, то есть проверяет, совпадают ли все их ключи и соответствующие значения. В отличие от toBe, toEqual проводит глубокое сравнение, учитывая все вложенные объекты и массивы.

Пример:

const obj1 = { name: 'John', age: 30 };
const obj2 = { name: 'John', age: 30 };
test('objects are deeply equal', () => {
  expect(obj1).toEqual(obj2); // Объекты содержат одинаковые ключи и значения
});

toHaveProperty

Matcher toHaveProperty проверяет, содержит ли объект определённое свойство с заданным значением. Это полезно для проверки наличия ключей в объектах, а также для верификации их значений.

Пример:

const obj = { name: 'John', age: 30 };
test('object has property', () => {
  expect(obj).toHaveProperty('name'); // Проверка на наличие свойства 'name'
  expect(obj).toHaveProperty('age', 30); // Проверка на наличие свойства 'age' со значением 30
});

toMatchObject

Мatcher toMatchObject используется для проверки, что объект соответствует частичной структуре другого объекта. Этот матчем позволяет проверить только те ключи и значения, которые указаны в ожидаемом объекте, игнорируя остальные свойства.

Пример:

const obj = { name: 'John', age: 30, city: 'New York' };
test('object matches partial structure', () => {
  expect(obj).toMatchObject({ name: 'John' }); // Проверка на частичное совпадение
  expect(obj).toMatchObject({ age: 30, city: 'New York' }); // Проверка на частичное совпадение
});

Этот матчем полезен, когда необходимо проверить наличие нескольких свойств в объекте без полного соответствия всем его данным.

Глубокие сравнения объектов

В случае с более сложными объектами, содержащими вложенные объекты или массивы, можно использовать матчеры для более глубокого сравнения.

toEqual с вложенными структурами

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

Пример:

const obj1 = { person: { name: 'John', age: 30 }, city: 'New York' };
const obj2 = { person: { name: 'John', age: 30 }, city: 'New York' };
test('deep comparison of nested objects', () => {
  expect(obj1).toEqual(obj2); // Глубокое сравнение вложенных объектов
});

toMatchObject с вложенными объектами

toMatchObject также поддерживает вложенные структуры, что позволяет проверить частичное совпадение объектов с учётом вложенных элементов.

Пример:

const obj = { person: { name: 'John', age: 30 }, city: 'New York' };
test('partial match with nested objects', () => {
  expect(obj).toMatchObject({ person: { name: 'John' } }); // Проверка частичного совпадения с вложенным объектом
});

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

Проверка объектов с использованием регулярных выражений

Иногда для проверки значений свойств объектов удобно использовать регулярные выражения. Jest поддерживает такую проверку с помощью матчеров, таких как toMatch и toEqual, если значением является строка.

Пример:

const obj = { name: 'John Doe', email: 'john@example.com' };
test('object values match regular expression', () => {
  expect(obj.name).toMatch(/John/); // Проверка, что свойство 'name' содержит 'John'
  expect(obj.email).toMatch(/@example\.com$/); // Проверка, что email заканчивается на '@example.com'
});

Проверка на пустые объекты

Для проверки, что объект пуст, можно использовать матчеры toEqual или toBe.

Пример:

const emptyObj = {};
test('object is empty', () => {
  expect(emptyObj).toEqual({}); // Объект равен пустому объекту
});

Можно также проверить, что объект не содержит свойств с помощью toBe или проверок длины свойств:

test('object is empty', () => {
  expect(Object.keys(emptyObj).length).toBe(0); // Объект не содержит свойств
});

Сравнение объектов с массивами

Объекты, содержащие массивы, также могут быть сравнены с помощью матчеров. Если объект имеет массив как одно из значений, можно использовать toEqual для глубокого сравнения.

Пример:

const obj1 = { name: 'John', hobbies: ['reading', 'swimming'] };
const obj2 = { name: 'John', hobbies: ['reading', 'swimming'] };
test('object with array is deeply equal', () => {
  expect(obj1).toEqual(obj2); // Глубокое сравнение объектов с массивами
});

Совмещение матчеров для сложных проверок

Часто возникает необходимость комбинировать несколько матчеров для выполнения более сложных проверок. Например, можно использовать toHaveProperty для проверки наличия определённого свойства и одновременно применять toEqual для более детальной проверки его значения.

Пример:

const obj = { person: { name: 'John', age: 30 }, city: 'New York' };
test('combining matchers for complex checks', () => {
  expect(obj).toHaveProperty('person.name', 'John'); // Проверка наличия свойства и его значения
  expect(obj).toEqual({ person: { name: 'John', age: 30 }, city: 'New York' }); // Глубокое сравнение
});

Заключение

Матчеры для объектов в Jest предлагают мощный инструментарий для проверки структуры данных. Эти матчеры позволяют проверять объекты на равенство, содержимое, наличие свойств и соответствие частичным структурам. Умелое использование этих инструментов позволяет писать точные и надёжные тесты для JavaScript-приложений, обеспечивая проверку как простых объектов, так и сложных вложенных структур.