---
title: "Sandbox publikovania — Testing for Laravel | Roundly"
description: "UsesPublishSandbox presunie config/, database/ a app/ do dočasného adresára pre každý test, takže testy publikovania nezapisujú do zdieľanej kostry."
url: https://roundly-consulting.com/sk/open-source/navody/testing-for-laravel/sandbox-publikovania
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Testing for Laravel](https://roundly-consulting.com/sk/open-source/navody/testing-for-laravel.md)

# 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
<?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. |

```php
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č:

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/testing-for-laravel.md)
