Формат сценариев
Каждый файл 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 }}given (предусловие)
Заголовок раздела «given (предусловие)»| Поле | Описание |
|---|---|
props |
Начальные props; ключи должны существовать в props спецификации с тем же именем |
state |
Начальное состояние компонента; свободные ключи для платформо-специфичных сценариев (например, { "text": "Кнопка" }) |
when (действие)
Заголовок раздела «when (действие)»| Поле | Описание |
|---|---|
action |
Обязательно, одно из шести значений (см. ниже) |
target |
Цель действия (например, имя слота, имя дочернего компонента) |
payload |
Полезная нагрузка действия (например, текст для ввода) |
Шесть действий: render (рендеринг) / click (нажатие) / input (ввод) / focus (получение фокуса) / blur (потеря фокуса, зарезервировано, ни один компонент сейчас не использует) / custom (пользовательское, должно поясняться через target).
then (утверждения)
Заголовок раздела «then (утверждения)»| Поле | Описание |
|---|---|
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": "" } }] }}Связь со spec
Заголовок раздела «Связь со spec»Команда pnpm verify:specs проверяет:
- входят ли ключи
given.propsв props спецификации - присутствуют ли имена из
then.events[].nameв events спецификации
Поэтому при переименовании props / events в spec необходимо синхронно менять cases.
Текущий список компонентов
Заголовок раздела «Текущий список компонентов»15 компонентов; общее количество сценариев меняется от версии к версии. Все сценарии — на странице Справочник по золотым сценариям.
Copyright © 2024-2026 FengMo WenXue