Проект Effect предлагает новый подход к тестированию — без баз данных, моков и контейнеров. Вместо этого каждый шаг пайплайна возвращает инертный объект, по которому можно пройтись и проверить команды. Код просто смотрит, что step.cmd.name равен 'cmdFindUser', а step.type — 'Command'. Никакого вранья про базу, никаких фейков в памяти.
Для дебага берут запись реального продакшен-прогона и прокручивают её локально. Effect запоминает, что каждая команда вернула в бою, а потом подставляет эти же результаты обратно в то же дерево. Получается точное воспроизведение пути без единого I/O вызова. Просто step.next(recorded[step.cmd.name]) — и поехали.
Тесты на отказоустойчивость перестали быть мучительными. Retry оборачивает любой Effect в логику повторов, но поскольку конфиг — это просто данные, тест проверяет его напрямую. Никаких таймеров, sleep и плавающего timing. Указал { attempts: 3, delay: 200, backoff: 2 } — и система будет ждать 200, потом 400, потом 800 миллисекунд.
Параллельное выполнение работает как Promise.all с остановкой на первой ошибке, но контекст прокидывается во все ветки автоматически. Parallel берёт массив эффектов и собирает результаты: ([user, perms]) => Success({ user, perms }).
Внедрение зависимостей — через Ask. Функции домена остаются чистыми, ничего не тащат в сигнатуре. Просто крутятся в контексте, а ctx.tenant приходит из runEffect. Никакой грязи.
Для OpenTelemetry — хуки жизненного цикла. onRun, onStep, onBeforeCommand позволяют оборачивать воркфлоу в спаны, не трогая доменный код. Достаточно вызвать configureEffect и передать колбэк, который запускает tracer.startActiveSpan. Всё остальное делает Effect.
Короче, тесты превращаются в работу с деревьями данных. Никто не ждёт, никто не стучится в сеть. Просто assert по тому, что команда собиралась сделать, и replay того, что реально случилось. Идея из разряда «а ведь можно было и так, да?».