TestHandler
Corre la suite de pruebas de la app anfitriona y devuelve el veredicto como un valor. ── POR QUÉ EXISTE ────────────────────────────────────────────────────────────────────────────── Porque «probar» no puede significar sólo «revisar convenciones». El verificador que corre después de `make` reflexiona la clase recién escrita y comprueba que cumple las reglas del framework: que carga, que implementa lo que dice, que no imprime a la salida. Eso es real y atrapa mucho — y no atrapa nada de lo que el código HACE. Una entidad que satisface `EntityInterface` a la perfección puede devolver el campo equivocado en `toArray()`, y el verificador la aprueba. Quien escribe código tiene que poder ejecutarlo. Para una persona eso es teclear `phpunit`; para un agente, sin este átomo, no era nada: escribía, veía «PASS» de una verificación estructural, y ahí se acababa lo que podía saber de su propio trabajo. Un lazo que se cierra en la forma y no en el comportamiento enseña a confiar en la mitad barata. ── POR QUÉ ESTE SÍ SACA UN SUBPROCESO ────────────────────────────────────────────────────────── El resto del paquete presume de no hacerlo: {@see \Milpa\DevTools\Make\VerifyRunner} dejó de llamar a `php scripts/verify-*.php` justamente para correr en el mismo proceso que acaba de escribir el archivo. Aquí es al revés, y por la misma clase de razón: una suite necesita su propio proceso. Cargar las pruebas dentro de éste heredaría el autoloader ya poblado, las clases ya cargadas y el estado global de quien llamó; un fatal en una prueba se llevaría al agente entero, y el código de salida —que ES el veredicto de PHPUnit— no existiría. Aislar no es un lujo aquí, es lo que hace que el resultado signifique algo. ── LO QUE CUIDA ──────────────────────────────────────────────────────────────────────────────── Un `path` que apunte fuera de la raíz se rechaza antes de armar el comando: la entrada ya no viene sólo de una terminal. Hay un plazo (`timeout`) porque una suite colgada colgaría a quien la llamó, y {@see ProcessRunner} la mata diciendo por qué — esperar para siempre no es una respuesta. Y la salida se recorta con una marca que dice que se recortó: un reporte truncado en silencio es peor que uno corto.
TestHandler::__construct()
public function __construct(Milpa\DevTools\Support\RootResolver $roots = new RootResolver(), Milpa\DevTools\Support\ProcessRunner $runner = new ProcessRunner()):Parameters
| Name | Type | Description |
|---|---|---|
| $roots | Milpa\DevTools\Support\RootResolver | |
| $runner | ProcessRunner | costura para las pruebas de ESTE paquete: correr PHPUnit de verdad desde dentro de PHPUnit es una recursión que no se quiere depurar. Es una CLASE y no un `Closure` porque un contenedor que autoresuelve constructores sabe qué hacer con la primera y no con el segundo. |
TestHandler::handle()
public function handle(array $input): arrayCorre la suite y contesta cómo le fue.
Parameters
| Name | Type | Description |
|---|---|---|
| $input | array<string, mixed> |