NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Testing for Laravel

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

ČlenSprá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(): arrayPrepíšte, ak chcete presunúť menej: ľubovoľné z config, database, app (predvolene všetky tri). Čokoľvek iné vyhodí InvalidArgumentException.
preparePublishSandbox(string $root): voidPrepíš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 kryptomien

Odoslaní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.