> Писали ли проверки для JSON схемы, чтобы проверить наличие и порядок элементов в ответе (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: DCloud
Стек: JavaScript
> Пример ответа
Короткий ответ
Да, для проверки JSON схемы в ответах API я использовал библиотеки вроде Ajv или JSON Schema Validator. Проверял не только наличие обязательных полей и их типы, но и порядок элементов в массивах через prefixItems или кастомные валидаторы. Для порядка объектов в ответе - сравнивал ключи через Object.keys() или использовал additionalProperties: false для строгой структуры. В основном это было в интеграционных тестах на Jest или Playwright.
Подробное объяснение
JSON Schema - это стандарт описания структуры JSON-данных. Он позволяет декларативно задать:
- обязательные поля (
required) - типы значений (
type,enum) - ограничения на строки, числа, массивы (
minLength,maximum,minItems) - вложенность и структуру объектов (
properties,additionalProperties)
Для проверки порядка элементов в массиве стандартная JSON Schema до draft 2020-12 не даёт прямого механизма. Но есть подходы:
prefixItems(draft 2020-12) - задаёт схему для первых N элементов массива, но не контролирует порядок произвольной длины.- Кастомные keywords - расширение Ajv через
ajv.addKeyword(), где можно написать функцию, проверяющую порядок по заданному критерию (например, сортировку поidили дате). - Отдельная проверка в тесте - после валидации схемы дополнительно сравнивать массив с ожидаемым порядком через
toEqualилиtoStrictEqual.
Для проверки порядка ключей в объекте JSON Schema не поддерживает это нативно. Приходится либо использовать кастомный keyword, либо в тесте сравнивать Object.keys(response) с ожидаемым массивом.
На практике я чаще комбинировал: схема для типов и обязательности, а порядок - отдельной проверкой в тесте. Это проще поддерживать и читать.
На практике
В реальных проектах я использовал такой подход:
- Схема лежит в отдельном файле рядом с тестами, например
schemas/userResponse.schema.json. - Валидация через Ajv с опцией
allErrors: trueдля сбора всех ошибок. - Для порядка элементов в массиве - кастомный keyword
orderedBy, который принимает имя поля и направление сортировки. - Для порядка ключей объекта - отдельная утилита
expectKeysInOrder.
Это удобно, потому что схема переиспользуется и в unit-тестах, и в e2e-тестах на Playwright. Если API меняется, достаточно поправить схему в одном месте.
Пример кода
JAVASCRIPT// schema.userResponse.jsconst Ajv = require('ajv');const ajv = new Ajv({ allErrors: true });ajv.addKeyword({keyword: 'orderedBy',type: 'array',compile: ([field, direction = 'asc']) => {return (data) => {for (let i = 1; i < data.length; i++) {const prev = data[i - 1][field];const curr = data[i][field];if (direction === 'asc' && prev > curr) return false;if (direction === 'desc' && prev < curr) return false;}return true;};},});const userListSchema = {type: 'object',required: ['users'],properties: {users: {type: 'array',minItems: 1,orderedBy: ['id', 'asc'],items: {type: 'object',required: ['id', 'name'],properties: {id: { type: 'integer' },name: { type: 'string' },},additionalProperties: false,},},},additionalProperties: false,};// тестconst validate = ajv.compile(userListSchema);const response = await api.getUsers();expect(validate(response)).toBe(true);expect(Object.keys(response)).toEqual(['users']);
Как отвечать на собеседовании
Начни с прямого ответа - да, писал. Затем кратко опиши, какие библиотеки использовал и зачем. Упомяни ограничения стандартной JSON Schema по порядку элементов и как их обходил. Покажи, что понимаешь разницу между валидацией структуры и проверкой бизнес-логики порядка. Если спросят про порядок ключей - честно скажи, что это нестандартный кейс, и обычно решается отдельной проверкой. Приведи пример из реального проекта, если есть.
Что проверяет интервьюер
- Понимание JSON Schema: обязательные поля, типы, вложенность.
- Знание ограничений стандарта и умение их обходить.
- Практический опыт с Ajv или аналогичными инструментами.
- Умение писать читаемые и поддерживаемые тесты.
- Способность объяснить trade-off между декларативной схемой и императивной проверкой.
Типичные ошибки
- Утверждение, что JSON Schema нативно поддерживает порядок элементов - это не так.
- Использование
additionalProperties: falseбез необходимости - ломает тесты при добавлении новых полей в API. - Проверка порядка ключей объекта через схему - стандарт это не поддерживает, попытка сделать это через
propertyNamesилиpatternProperties- хак, который сложно поддерживать. - Игнорирование
allErrors: true- без него Ajv возвращает только первую ошибку, что усложняет отладку. - Хранение схем в тестах вместо отдельных файлов - усложняет переиспользование и ревью.
> Похожие задачи по frontend
Как реализована отправка JSON в API
Какие типы могут быть ключами в JSON
Как работает JSON и как передается информация с его помощью?
Почему нельзя использовать Promise.all для решения задачи с покупателями в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью