Naar hoofdinhoud gaan
Wanneer een package externe commando’s zoals ffmpeg of git aanroept, worden verschillen in de omgeving van de gebruikende applicatie en mislukkingen direct het gedrag van het package. Roep shell_exec() of exec() niet rechtstreeks aan, maar voer commando’s uit via de Process-facade en vervang ze in tests door Process::fake().
Deze pagina is gericht op Laravel 13 en controleert de implementatie van Framework v13.42.0. Ze gaat uit van kennis van processen en packages testen. Het matchen van array-commando’s op deze pagina gaat uit van de manier waarop Symfony Process, dat Process intern gebruikt, argumenten omzet.

Waarom je directe uitvoering vermijdt

Directe functieaanroepen kun je in tests niet vervangen, en elke aanroeper gaat anders om met timeouts en exitcodes. Via de Process-facade maak je het vastleggen van uitvoeringen, fakes, timeouts en exceptions bij mislukking uniform.

Geef commando’s door als array

Een commando als string wordt door sh geïnterpreteerd. Bevat het gebruikersinvoer, dan ontstaan problemen met aanhalingstekens en ruimte voor injectie. Geef binnen een package argumenten door als array.
De standaardtimeout van PendingProcess is 60 seconden en de idle-timeout is null. Stel voor lange conversies timeout() expliciet in, en combineer het met idleTimeout() voor verwerking waarvan de uitvoer kan stilvallen.

Exceptions en meldingen bij mislukking

ProcessResult::throw() gooit een ProcessFailedException wanneer de exitcode geen succes aangeeft. De melding bevat het uitgevoerde commando, de exitcode en de standaarduitvoer en standaardfoutuitvoer.
Als je geheimen in commando-argumenten zet, komen ze in de melding van ProcessFailedException terecht en kunnen ze in logs of op het scherm verschijnen. Geef tokens niet als argument door. Geef ze mee met env() of schrijf ze in het configuratiebestand van het commando.
Timeouts worden weergegeven door ProcessTimedOutException en idle-timeouts door ProcessIdleTimedOutException. Documenteer voor de gebruikers van je package welke exceptions je gooit en wat ze kunnen verwachten wanneer ze die afvangen.

Fake in tests

Vervang externe commando’s in tests door Process::fake(). Met Process::result() geef je de standaarduitvoer, de standaardfoutuitvoer en de exitcode op.
Als je een closure aan assertRan() doorgeeft, kun je command, timeout, environment en andere eigenschappen van PendingProcess controleren. Array-commando’s worden met $process->command op exacte gelijkheid vergeleken, zodat tests wijzigingen in de volgorde of waarden van argumenten opmerken.

Fake-sleutels voor array-commando’s

Intern vergelijkt Process de sleutels van fake() met Str::is() met het resultaat van getCommandline(). Array-commando’s worden omgezet in een string met aanhalingstekens voor de shell, dus een stringpatroon zoals 'ffmpeg*' matcht niet. Gebruik in tests van array-commando’s een van de volgende manieren.

Onverwachte externe commando’s voorkomen

Gebruik preventStrayProcesses() om externe commando’s te detecteren die in tests niet zouden moeten draaien. Commando’s die met geen enkele fake overeenkomen, leiden tot een RuntimeException en starten niet echt.

Als je een geïnjecteerde Factory gebruikt

Als de constructor van je package Illuminate\Process\Factory ontvangt, controleer dan of de toestand van Process::fake() de geïnjecteerde instantie bereikt. De facade cachet de opgeloste instantie en swap() vervangt de instantie in de container. Of Factory in de container gedeeld wordt, kun je echter niet overlaten aan een expliciete registratie door het framework. Controleer het daarom in een test. Bereikt de fake de geïnjecteerde instantie niet, vervang de Factory dan expliciet in de test of ontwerp het package zo dat het via de Process-facade loopt. Controleer in beide gevallen met assertRan() dat de aanroep is vastgelegd. Zo merk je een vergeten vervanging op.

Extra controles voor onderhoud op lange termijn

Geraadpleegde primaire bronnen

Laatst gewijzigd op 13 november 2026