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); // Объекты содержат одинаковые ключи и значения
});
toHavePropertyMatcher 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-приложений, обеспечивая проверку как простых объектов, так и сложных вложенных структур.