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 doorsh geïnterpreteerd. Bevat het gebruikersinvoer, dan ontstaan problemen met aanhalingstekens en ruimte voor injectie. Geef binnen een package argumenten door als array.
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.
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 doorProcess::fake(). Met Process::result() geef je de standaarduitvoer, de standaardfoutuitvoer en de exitcode op.
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 vanfake() 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
GebruikpreventStrayProcesses() 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 packageIlluminate\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.