Перейти к содержимому

Формат сценариев

Каждый файл cases/<name>.json — это набор золотых сценариев компонента: переводимые между платформами поведенческие утверждения. Формат строго задан cases/schema.json.

Логика не разделяется, поведение разделяется.

Платформы не делятся никаким тестовым кодом; вместо этого каждая нативная платформа вручную переводит единый набор cases в свои локальные тесты (JUnit / XCTest / ohpm test / C-тесты). Cases описывают только поведение (какие условия заданы, какое действие выполняется, какой результат ожидается) и не содержат никаких платформо-специфичных API.

{
"$schema": "./schema.json",
"component": "button",
"cases": [ ... ]
}
  • component: kebab-case, должен совпадать с name спецификации с тем же именем
  • cases: как минимум один сценарий

Каждый сценарий обязан содержать id / name / given / when / then:

{
"id": "disabled-blocks-click",
"name": "В отключённом состоянии onClick не срабатывает",
"given": { "props": { "disabled": true } },
"when": { "action": "click" },
"then": {
"events": [{ "name": "onClick", "assertion": "notEmitted" }],
"enabled": false
}
}
Поле Описание
props Начальные props; ключи должны существовать в props спецификации с тем же именем
state Начальное состояние компонента; свободные ключи для платформо-специфичных сценариев (например, { "text": "Кнопка" })
Поле Описание
action Обязательно, одно из шести значений (см. ниже)
target Цель действия (например, имя слота, имя дочернего компонента)
payload Полезная нагрузка действия (например, текст для ввода)

Шесть действий: render (рендеринг) / click (нажатие) / input (ввод) / focus (получение фокуса) / blur (потеря фокуса, зарезервировано, ни один компонент сейчас не использует) / custom (пользовательское, должно поясняться через target).

Поле Описание
events Массив утверждений о событиях
tokens Массив утверждений о применении токенов
visible Ожидаемая видимость
enabled Ожидаемая возможность взаимодействия
text Ожидаемый выводимый текст
notes Платформенно-нейтральные дополнительные пояснения к утверждениям (на естественном языке)

Утверждения о событиях:

{
"name": "onValueChange",
"assertion": "emitted",
"times": 1,
"payload": { "value": "青花瓷" }
}
  • name: должно присутствовать в events спецификации с тем же именем
  • assertion: emitted (сработало) или notEmitted (не сработало)
  • times: необязательно, ожидаемое количество срабатываний
  • payload: необязательно, ожидаемая полезная нагрузка (глубокое сравнение)

Утверждения о токенах:

{ "path": "button.height.large", "applied": false }

path — полный путь токена; applied утверждает, применён ли этот токен к результату рендеринга. Обратное утверждение applied: false используется для проверки взаимного исключения размеров (например, при выбранном размере small токен button.height.large не должен потребляться).

{
"id": "small-size-uses-small-tokens",
"name": "Малый размер потребляет токены малого размера",
"given": { "props": { "size": "small" } },
"when": { "action": "render" },
"then": {
"tokens": [
{ "path": "button.height.small", "applied": true },
{ "path": "button.fontSize.small", "applied": true },
{ "path": "button.height.large", "applied": false }
]
}
}
{
"id": "clearable-emits-empty-value",
"name": "Кнопка очистки запускает пустое значение",
"given": { "props": { "value": "Существующий текст", "clearable": true } },
"when": { "action": "custom", "payload": { "call": "clear" } },
"then": {
"events": [{ "name": "onValueChange", "assertion": "emitted", "times": 1, "payload": { "value": "" } }]
}
}

Команда pnpm verify:specs проверяет:

  • входят ли ключи given.props в props спецификации
  • присутствуют ли имена из then.events[].name в events спецификации

Поэтому при переименовании props / events в spec необходимо синхронно менять cases.

15 компонентов; общее количество сценариев меняется от версии к версии. Все сценарии — на странице Справочник по золотым сценариям.

Copyright © 2024-2026 FengMo WenXue