Appearance
Кастомные значения
Значения по умолчанию делают объект корректным, но иногда полю нужно осмысленное значение: валидный номер телефона, уникальный идентификатор, реалистичное имя. Для этого в конфиге есть настройка output.values.
Селекторы
Ключ в values — селектор, который определяет, к каким полям применяется правило:
| Селектор | Что означает |
|---|---|
"Account.phone" | Правило применяется к полю phone типа Account. |
"*.id" | Правило применяется к полю id во всех типах, на любой глубине вложенности. |
"PhoneNumber" | Правило задаёт значение по умолчанию для типа целиком: оно попадёт в хелпер GetStubPhoneNumber и во все места, где этот тип используется. |
Если к полю подходит несколько правил, побеждает более конкретное: сначала Тип.поле, затем *.поле, затем значение типа поля. Правило на опциональном поле заполняет его — без правила опциональные поля в стаб не попадают.
Если селектор не совпал ни с одним полем или типом, генератор выдаст предупреждение value-unused — скорее всего, в селекторе опечатка.
Выражения
Значение правила — это выражение TypeScript, записанное строкой. Оно вставляется в сгенерированный код как есть и вычисляется при каждом вызове хелпера:
json
{
"output": {
"values": {
"Account.phone": "'+7 900 000-00-00'",
"*.createdAt": "new Date(2020, 0, 1)",
"*.id": "crypto.randomUUID()"
}
}
}Обратите внимание на кавычки в первом правиле: строковое значение — это выражение-строковый литерал, поэтому оно записано в дополнительных одинарных кавычках.
Свои хелперы через setup-файл
Когда выражения усложняются — нужен счётчик, генератор фейковых данных или общая функция, — вынесите их в отдельный файл и укажите его в output.setupFile. Содержимое этого файла вклеивается в сгенерированный файл сразу после импортов, поэтому его функции доступны выражениям напрямую:
ts
// src/testing/stub-setup.ts
let nextIdCounter = 0;
const nextId = (): string => `id-${++nextIdCounter}`;json
{
"output": {
"file": "src/testing/stubs.ts",
"setupFile": "src/testing/stub-setup.ts",
"values": { "*.id": "nextId()" }
}
}В сгенерированном файле вставленный блок выделен комментариями:
ts
import type { Account } from "../models/account";
// --- начало setup-файла (src/testing/stub-setup.ts); правьте исходный файл ---
let nextIdCounter = 0;
const nextId = (): string => `id-${++nextIdCounter}`;
// --- конец setup-файла ---
export function GetStubAccount(overrides: Partial<Account> = {}): Account {
return {
id: (nextId()),
balance: 0,
...overrides,
};
}Корректность типов проверяет TypeScript при сборке тестов: если функции не существует или она возвращает значение не того типа, сборка укажет на ошибку прямо в сгенерированном файле.
Импорты в setup-файле
Содержимое setup-файла становится частью сгенерированного файла, поэтому относительные импорты в нём резолвятся от места сгенерированного файла. Проще всего держать setup-файл в той же папке, что и стабы. Импортов пакетов (@faker-js/faker, nanoid) это не касается.
Готовые примеры — инкрементальные id и реалистичные данные через faker — собраны на странице «Рецепты».