> Как проверять разные наборы полей одного класса при десериализации JSON в тестах (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: LeanSoftwareProduction

Стек: JavaScript

> Пример ответа

Для проверки разных наборов полей одного класса при десериализации JSON в тестах на JavaScript можно использовать несколько подходов.

1. Использование библиотеки class-transformer с опциями:

JAVASCRIPT
import { 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. Кастомная утилита с фильтрацией полей:

JAVASCRIPT
function 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 типами:

TYPESCRIPT
interface 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:

JAVASCRIPT
function 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 с группами.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью