> Как проверять разные наборы полей одного класса при десериализации JSON в тестах (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: LeanSoftwareProduction
Стек: JavaScript
> Пример ответа
Для проверки разных наборов полей одного класса при десериализации JSON в тестах на JavaScript можно использовать несколько подходов.
1. Использование библиотеки class-transformer с опциями:
JAVASCRIPTimport { plainToClass, Expose, Transform } from 'class-transformer';class User {@Expose() id: number;@Expose() name: string;@Expose() email: string;@Expose({ groups: ['admin'] }) role: string;}// Тест для публичного набораconst publicJson = { id: 1, name: 'John', email: 'john@test.com' };const publicUser = plainToClass(User, publicJson, { groups: ['public'] });expect(publicUser.role).toBeUndefined();// Тест для административного набораconst adminJson = { id: 2, name: 'Jane', email: 'jane@test.com', role: 'admin' };const adminUser = plainToClass(User, adminJson, { groups: ['admin'] });expect(adminUser.role).toBe('admin');
2. Кастомная утилита с фильтрацией полей:
JAVASCRIPTfunction deserializeWithFields(json, fields) {const obj = JSON.parse(json);const filtered = {};fields.forEach(field => {if (obj.hasOwnProperty(field)) {filtered[field] = obj[field];}});return filtered;}// В тестахconst rawJson = '{"id":1,"name":"John","email":"john@test.com","role":"admin"}';const basicFields = deserializeWithFields(rawJson, ['id', 'name']);expect(basicFields).toEqual({ id: 1, name: 'John' });
3. Использование TypeScript с partial типами:
TYPESCRIPTinterface User {id: number;name: string;email: string;role?: string;}// В тесте проверяем только обязательные поляconst json = JSON.parse('{"id":1,"name":"John"}') as Partial<User>;expect(json.id).toBe(1);expect(json.name).toBe('John');expect(json.email).toBeUndefined(); // поле отсутствует
4. Динамическая проверка через Object.keys:
JAVASCRIPTfunction validateFields(json, expectedFields) {const obj = JSON.parse(json);const actualFields = Object.keys(obj);expect(actualFields.sort()).toEqual(expectedFields.sort());}// ТестvalidateFields('{"id":1,"name":"John"}', ['id', 'name']);validateFields('{"id":2,"name":"Jane","email":"jane@test.com"}', ['id', 'name', 'email']);
Выбор метода зависит от сложности проекта: для простых случаев достаточно Object.keys, для больших приложений с классами - class-transformer с группами.
> Похожие задачи по frontend
Как обрабатывать валидацию JSON схемы с большим количеством полей и вложенных объектов
Как игнорировать порядок элементов в массивах при сравнении JSON в тестах
В чем разница между статическими и нестатическими методами в классах JavaScript
Какой метод вызывается при наследовании, если метод определён в прототипе родителя и в экземпляре дочернего класса в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью