При разработке приложений на JavaScript часто возникает необходимость работать с коллекциями данных, такими как списки и объекты. Одним из ключевых аспектов тестирования этих данных является проверка правильности их обработки, например, проверка значений в списках или соответствия ключей в объектах. В Jest для этого предоставляются различные методы и подходы, которые позволяют создавать эффективные и точные тесты.
Массивы в JavaScript являются одной из наиболее часто используемых структур данных, и проверка их правильности в тестах требует внимательного подхода. В Jest есть несколько методов, которые упрощают этот процесс.
Один из самых распространённых случаев тестирования массива —
проверка его длины. Jest предоставляет удобный метод
.toHaveLength(), который проверяет, что массив содержит
ожидаемое количество элементов.
test('массовый список содержит 3 элемента', () => {
const list = [1, 2, 3];
expect(list).toHaveLength(3);
});
Этот тест проверяет, что массив list содержит 3
элемента. В случае несоответствия длины тест не пройдёт, и Jest выдаст
ошибку.
Чтобы проверить, содержится ли определённый элемент в массиве, можно
использовать метод .toContain(). Он проверяет, присутствует
ли в массиве заданное значение.
test('массив содержит число 2', () => {
const list = [1, 2, 3];
expect(list).toContain(2);
});
Этот тест убедится, что число 2 присутствует в массиве.
Если требуется удостовериться, что массив содержит конкретные
значения в определённом порядке, можно использовать метод
.toEqual(). Он сравнивает содержимое массива с
ожидаемым.
test('массив совпадает с ожидаемым', () => {
const list = [1, 2, 3];
expect(list).toEqual([1, 2, 3]);
});
Если порядок элементов важен, этот тест подтвердит, что массив действительно соответствует ожидаемому.
Объекты в JavaScript используются для хранения данных в виде пар «ключ-значение». Проверка правильности объектов в тестах часто сводится к проверке наличия нужных ключей и их значений.
Для проверки, что объект содержит конкретный ключ, можно использовать
метод .toHaveProperty(). Этот метод проверяет, что объект
имеет определённый ключ, и может дополнительно проверять значение этого
ключа.
test('объект содержит ключ name', () => {
const obj = { name: 'Alice', age: 25 };
expect(obj).toHaveProperty('name');
});
Этот тест проверяет, что объект obj имеет ключ
name.
Метод .toHaveProperty() также позволяет проверять
значение ключа в объекте. Например, если требуется проверить, что ключ
name в объекте имеет значение Alice, можно
написать следующий тест:
test('объект имеет ключ name со значением Alice', () => {
const obj = { name: 'Alice', age: 25 };
expect(obj).toHaveProperty('name', 'Alice');
});
Если значение ключа не совпадает с ожидаемым, тест не пройдёт.
Чтобы убедиться, что объект содержит несколько ключей, можно
использовать метод .toMatchObject(). Этот метод позволяет
проверить, что объект содержит определённые ключи и значения, при этом
остальные ключи могут быть любыми.
test('объект соответствует частичной структуре', () => {
const obj = { name: 'Alice', age: 25, city: 'London' };
expect(obj).toMatchObject({ name: 'Alice', age: 25 });
});
Этот тест убедится, что объект содержит ключи name и
age с нужными значениями, но другие ключи могут не
соответствовать.
В реальных приложениях данные в списках и объектах часто изменяются динамически, что делает тестирование сложнее. В таких случаях может потребоваться использование мока данных или асинхронных операций для проверки значений.
Если элементы массива или ключи объекта получают значения асинхронно
(например, из базы данных или API), необходимо использовать асинхронные
тесты. В Jest для этого можно использовать async/await в
комбинации с методами expect.
test('данные загружаются асинхронно и массив содержит элемент', async () => {
const loadData = async () => {
return new Promise((resolve) => setTimeout(() => resolve([1, 2, 3]), 1000));
};
const data = await loadData();
expect(data).toContain(2);
});
Этот тест проверяет, что асинхронная функция возвращает массив, в котором присутствует элемент 2.
В случае, когда данные в списках или объектах имеют сложную вложенную структуру, можно использовать комбинированные проверки. Jest поддерживает глубокое сравнение объектов и массивов, что позволяет проверять вложенные значения.
test('массив объектов содержит правильные ключи и значения', () => {
const list = [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }];
expect(list).toContainEqual({ name: 'Alice', age: 25 });
});
Здесь проверяется, что массив list содержит объект с
ключами name и age, и что его значения
соответствуют ожидаемым.
В некоторых случаях может быть полезно написать собственные матчер-функции для более гибкой проверки данных. Например, можно создать матчеры для проверки определённых структур в массиве или объекте, которые будут удобны для многократного использования.
expect.extend({
toContainObject(received, argument) {
const pass = received.some(item => {
return Object.keys(argument).every(key => item[key] === argument[key]);
});
if (pass) {
return {
message: () => `expected ${received} not to contain object ${argument}`,
pass: true,
};
} else {
return {
message: () => `expected ${received} to contain object ${argument}`,
pass: false,
};
}
},
});
test('массив содержит объект с правильными ключами и значениями', () => {
const list = [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }];
expect(list).toContainObject({ name: 'Alice', age: 25 });
});
Этот пример расширяет Jest новыми методами и позволяет тестировать массивы на наличие объектов с нужными ключами и значениями.
Тестирование массивов и объектов в Jest требует внимательности к деталям, особенно когда структуры данных могут быть сложными или динамичными. Использование стандартных методов Jest для проверки длины, наличия элементов, ключей и значений позволяет создавать точные и надёжные тесты. В случае необходимости можно писать собственные матчеры, что открывает дополнительные возможности для проверки данных.