Sandbox publikovania
Pre test, ktorý publikuje, inštaluje alebo generuje súbory. Každý proces pest --parallel bootuje z tej istej kostry Testbench: Testbench načíta každý config/*.php v nej a migrate spustí každý súbor v database/migrations. Test, ktorý do nej zapisuje, zhodí iný test, keď súbor počas bootu pribudne alebo zmizne („Path must not be empty“ v LoadConfiguration, migrácia spustená dvakrát), a pozostatok načíta každý ďalší beh. Concern UsesPublishSandbox nasmeruje tieto cesty do vlastného adresára pre každý test a po skončení testu ho zmaže:
<?php
use RoundlyConsulting\Testing\Concerns\UsesPublishSandbox;
// tests/Pest.php — Pest binds a test case per directory
uses(TestCase::class, UsesPublishSandbox::class)->in('Publish');
// tests/Publish/PublishTest.php
it('publishes into the sandbox, never the shared skeleton', function (): void {
$this->assertPublishesIntoSandbox('credits-config', 'credits-migrations');
});
it('publishes the config', function (): void {
$this->artisan('vendor:publish', ['--tag' => 'credits-config'])->assertSuccessful();
expect($this->publishSandbox('config/credits.php'))->toBeFile();
});Prípadne použite UsesPublishSandbox v základnom test case pre daný adresár. Je len pre balíky — predpokladá aplikáciu Testbench.
API
| Člen | Správanie |
|---|---|
publishSandbox(string $path = '') | Koreň sandboxu (v sys_get_temp_dir()) alebo cesta v ňom. Pred vytvorením aplikácie vyhodí LogicException. |
assertPublishesIntoSandbox(string ...$tags) | Pripnutie: každý presunutý pomocník (config_path(), database_path(), app_path()) vedie do sandboxu a rovnako každý cieľ, ktorý tag mapuje (ServiceProvider::pathsToPublish(null, $tag)). Tag, ktorý nemapuje nič, zlyhá — prázdne mapovanie by prešlo bez akejkoľvek kontroly. |
publishSandboxPaths(): array | Prepíšte, ak chcete presunúť menej: ľubovoľné z config, database, app (predvolene všetky tri). Čokoľvek iné vyhodí InvalidArgumentException. |
preparePublishSandbox(string $root): void | Prepíšte, ak chcete do sandboxu vložiť súbory, ktoré hostiteľ už má — ešte pred registráciou providerov. |
use RoundlyConsulting\Testing\Concerns\UsesPublishSandbox;
// tests/Publish/PublishTestCase.php — config/ only, seeded with a file the host already has
abstract class PublishTestCase extends TestCase
{
use UsesPublishSandbox;
protected function publishSandboxPaths(): array
{
return ['config'];
}
protected function preparePublishSandbox(string $root): void
{
file_put_contents($root.'/config/credits.php', "<?php\n\nreturn ['host' => true];\n");
}
}Ako to funguje
- Cesty sa presunú ešte pred registráciou providerov, v getPackageProviders(). Provider, ktorý mapuje config_path(...) alebo database_path(...) už pri registrácii, si cieľ zafixuje v tej chvíli; sandbox nastavený v defineEnvironment() by presunul pomocníka, no publikovanie by ostalo nasmerované do kostry. Preto pripnutie kontroluje mapovanie publikovania, nielen pomocníka. Konfigurácia je v tom čase už načítaná z kostry, takže sada bootuje ako zvyčajne.
- app/ sa presunie až po zistení menného priestoru aplikácie. Laravel ho odvodí porovnaním app/ s composer.json kostry, ktorému by sandbox nezodpovedal, takže generátory make:* naďalej vytvárajú triedy App\….
- Každý test dostane vlastný sandbox a po skončení testu sa zmaže.
Prepísanie getPackageProviders()
Prepísaná getPackageProviders() sa musí stále dostať k metóde traitu. V podtriede to zabezpečí parent::getPackageProviders($app). V triede, ktorá trait používa, prepísanie nahradí metódu traitu, preto jej dajte alias a volajte ho. Test case, ktorý ju zakryje, odmietne setUp s LogicException, namiesto toho, aby sa providery zaregistrovali proti kostre. Ak providery deklarujete v packageProviders(), nemusíte prepisovať nič:
use RoundlyConsulting\Testing\Concerns\UsesPublishSandbox;
use RoundlyConsulting\Testing\PackageTestCase;
// Overriding getPackageProviders() in the class that uses the trait: alias the trait's method
abstract class PublishTestCase extends PackageTestCase
{
use UsesPublishSandbox {
getPackageProviders as sandboxProviders;
}
protected function getPackageProviders($app): array
{
// … your own logic
return $this->sandboxProviders($app);
}
}Nepokrýva: storage/, lang/ a zdieľané dočasné adresáre. Storage::fake() už pridáva token paralelného behu; súbor v zdieľanom dočasnom adresári hľadajte podľa jedinečnej značky, nikdy podľa počtu súborov pred a po.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.