Skip to content

Mock data

RMock — сохраняемый доменный документ с fixture-данными. Он позволяет вынести большой JSON из source других сущностей, переиспользовать один сценарий в нескольких preview и подключить data provider из application code без скрытого чтения файлов runtime-ом.

Mock не является runtime state, Store или production default. mock(identity) создаёт явную ссылку на документ, а consumer решает, когда materialize его значение.

Глобальный и локальный mock-mode

Workspace задаёт data mode по умолчанию. Конкретная Composition может переопределить его только для собственного runtime-поддерева:

ts
defineComposition({
  dataMode: 'mock',

  data: {
    state: store('telegraphy').isolated(),
  },

  runtimes: {
    page: composition('telegraphy-page'),
  },
})

Порядок разрешения: текущая Composition, ближайшая родительская Composition, effective Endge.context.dataMode, Workspace default. Поле dataMode отсутствует — режим наследуется; 'mock' и 'live' являются явными override.

Composition-level mode не создаёт новые mock-данные и не переписывает source. Он только определяет, будут ли Store initializers читать существующие RMock fixtures и должна ли существующая mock-mode ветка Query пропустить transport request. Query-local mock.enabled остаётся независимым.

Borrowed contextual/injected Store сохраняет state provider-а и не переинициализируется режимом consumer-а. Для независимого mock-state используйте store(identity).isolated(). Полный контракт наследования: Composition: режим данных.

Основные поля

ПолеНазначение
identityСтабильное имя, которое используется в mock(identity)
displayNameНазвание в Configurator
descriptionОписание сценария и назначения данных
contentSourcedocument или code-provider
contentTypeapplication/json или text/plain
sourcePersisted JSON/text для режима document
codeRefNamespaced ref provider-а для режима code-provider

identity и codeRef не взаимозаменяемы. Source всегда ссылается на persisted RMock.identity. codeRef используется только внутри документа, чтобы найти зарегистрированный application provider.

JSON document

Для обычного fixture выберите contentSource: document и contentType: application/json. Например, Mock с identity order-query-requirements может хранить значение одного typed Composition prop:

json
{
  "statuses": ["new", "in-progress"],
  "fields": ["id", "number", "status", "priority"],
  "minimumPriority": 1
}

Каждое чтение возвращает независимую JSON-копию. Изменение значения внутри одного preview не изменяет persisted Mock и другие preview sessions.

Code provider

Режим code-provider хранит данные не в source, а получает их через синхронный provider, зарегистрированный приложением:

ts
Endge.mock.registerProvider({
  ref: '@application:mocks.order-requirements',
  description: 'Order query requirements fixture',
  provide: () => ({
    statuses: ['new', 'in-progress'],
    fields: ['id', 'number', 'status', 'priority'],
    minimumPriority: 1,
  }),
})

Persisted RMock при этом содержит:

text
identity: order-query-requirements
contentSource: code-provider
codeRef: @application:mocks.order-requirements

Provider должен быть синхронным и возвращать JSON-compatible значение. Регистрация provider-а сама по себе не создаёт RMock document.

Composition preview

Composition принимает RMock как значение конкретного preview prop:

ts
defineComposition({
  props: defineProps({
    requirements: field('OrderQueryRequirements'),
  }),

  previewProps: definePreviewProps({
    requirements: mock('order-query-requirements'),
  }),

  runtimes: {},
})

Compiler сохраняет { kind: 'mock', identity } в ProgramArtifact.previewProps, добавляет dependency с ролью composition-preview:<prop> и проверяет binding status. Configurator Runtime Preview разрешает Mock и передаёт полученное значение через обычный mount({ props }).

Preview fixture не используется при production mount, запуске Project или вызове вложенной Composition. Подробный contract: Composition.

Store initializer

Store может использовать RMock как initial value:

ts
defineStore({
  data: {
    raw: value(mock('orders-response')),
  },
})

В отличие от Composition preview, это значение materialize уже самим StoreRuntimeHost как начальное runtime state поля raw.

Store читает initializer только при создании runtime. Изменение глобального data mode для уже смонтированного Store требует пересоздания соответствующего runtime-дерева.

Query mock и RMock

В Query существует локальная секция mock.enabled/mock.data. Это inline mock ответа конкретного Query и не является ссылкой на RMock document:

ts
defineQuery({
  mock: {
    enabled: true,
    data: {
      rows: [],
    },
  },
})

Используйте Query mock.data для небольшого сценария, принадлежащего одному запросу. Используйте RMock, когда данные большие, переиспользуются несколькими сущностями или должны предоставляться application code.

Component SFC

Component SFC также поддерживает definePreviewProps, но его runtime-backed значения сейчас задаются через fromStore и fromData. Прямая форма mock(identity) поддерживается в Composition preview и Store initializer. Для компонента RMock можно сначала materialize в Store, а затем прочитать через fromData.

Diagnostics

Возможные binding states:

StatusЗначение
documentPersisted JSON/text доступен
connectedPersisted document связан с зарегистрированным code provider
missing-documentRMock с указанным identity не загружен
missing-providerДокумент существует, но codeRef не зарегистрирован
invalid-contentJSON в source не разбирается

Store initializer рассматривает недоступный Mock как compile error, потому что от него зависит runtime state. Composition preview публикует warning: сломанный fixture не должен делать production Composition неисполняемой, но Runtime Preview завершится понятной ошибкой при попытке materialize значение.

Не храните в Mock secrets, access tokens или production credentials. Mock documents являются конфигурационными данными и могут экспортироваться вместе с workspace.

Vocab source

Vocab может выбрать весь JSON Mock либо значение по dot-path:

ts
defineVocab({
  mock: mock('demo-fixtures').path('lookups.airlines'),
  outputs: {
    items: output().from(response()),
  },
})

Числовые сегменты пути адресуют массивы, например groups.0.items. Явная ссылка на отсутствующий документ или путь публикует diagnostic и завершает materialization ошибкой.

Если Vocab не содержит mock(...), Mock Runtime возвращает для него []. При этом live provider, Auth и SSE не запускаются. Это отличается от authoring-команды «Полная загрузка словаря»: она намеренно обращается к live provider и может потребовать авторизацию.