Skip to content

Кастомные значения

Значения по умолчанию делают объект корректным, но иногда полю нужно осмысленное значение: валидный номер телефона, уникальный идентификатор, реалистичное имя. Для этого в конфиге есть настройка 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 — собраны на странице «Рецепты».