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

Zaznamenávajúci fake

Addresses::fake() nahradí manažéra — pre fasádu aj pre všetko, čo injektuje AddressManager — zaznamenávajúcim fake, ktorý nič nezapíše, a vráti ho. Pridané adresy zostanú v pamäti, neuložené, a čítania vlastníka (all(), ofType(), primary()) odpovedajú z uložených záznamov s premietnutými pridaniami, úpravami, zmazaniami a zmenami primárnej adresy z fake — primary() tak vráti to isté, čo by po rovnakých volaniach vrátil skutočný manažér. Vlastníctvo sa stále kontroluje a rovnako aj zákaz povýšiť zmazanú adresu. Zaznamenajú sa aj volania cez trait HasAddresses:

use RoundlyConsulting\Addresses\DataTransferObjects\AddressData;
use RoundlyConsulting\Addresses\Facades\Addresses;

$fake = Addresses::fake();

$user->addAddress($data);                       // your code under test
Addresses::for($user)->setPrimary($address);

$fake->assertAdded($user, fn (AddressData $d) => $d->city === 'Bratislava');
$fake->assertPrimarySet($address);
$fake->assertNothingDeleted();
AserciaOpak
assertAdded(?Model $to = null, ?Closure $where = null)assertNothingAdded()
assertUpdated(?Address $address = null, ?Closure $where = null)assertNothingUpdated()
assertDeleted(?Address $address = null)assertNothingDeleted()
assertPrimarySet(?Address $address = null)assertNothingPrimarySet()

Každý argument je voliteľný. assertAdded() filtruje podľa vlastníka a closure nad zaznamenaným AddressData; assertUpdated() prijíma adresu a closure nad jej AddressData.

Asercie nad databázou

Pri testoch s databázou pridáva trait InteractsWithAddresses dve asercie. V Peste ho použite cez uses(), v PHPUnite ako trait v triede testu:

use RoundlyConsulting\Addresses\Enums\AddressType;
use RoundlyConsulting\Addresses\Testing\InteractsWithAddresses;

uses(InteractsWithAddresses::class);

$this->assertHasAddress($payer, ['city' => 'Bratislava']);
$this->assertPrimaryAddress($payer, AddressType::Office);
use RoundlyConsulting\Addresses\Testing\InteractsWithAddresses;
use Tests\TestCase;

final class CustomerAddressTest extends TestCase
{
    use InteractsWithAddresses;
}
AserciaPrejde, keď
assertHasAddress(Model $addressable, array $criteria = [])Model má adresu, ktorá spĺňa každú dvojicu stĺpec => hodnota; bez kritérií stačí akákoľvek adresa.
assertPrimaryAddress(Model $addressable, AddressType $type)Model má primárnu adresu daného typu.

assertHasAddress() porovnáva kritériá so stĺpcami tabuľky addresses, preto zadávajte uložené hodnoty — ['type' => 'billing', 'country_iso' => 'SK'] — nie prípady enumu. Mäkko zmazané adresy sa nerátajú.

Factory

Address::factory() generuje realistické adresy. Predvolená definícia vytvorí bežnú adresu — is_primary je false, primárnu si vyžiadate stavom primary() — predvoleného typu, s faker názvom, mestom, ulicou a PSČ a trojpísmenovým country_iso:

StavÚčinok
primary()Nastaví is_primary na true.
ofType(AddressType $type)Nastaví type na hodnotu enumu.
billing()Skratka pre ofType(AddressType::Billing).
shipping()Skratka pre ofType(AddressType::Shipping).
use RoundlyConsulting\Addresses\Address;
use RoundlyConsulting\Addresses\Enums\AddressType;

// through the owner's relation — sets addressable_type and addressable_id for you
$customer->addresses()->save(Address::factory()->billing()->primary()->make());

// standalone, with the owner set explicitly
Address::factory()->shipping()->create([
    'addressable_type' => $customer->getMorphClass(),
    'addressable_id' => $customer->getKey(),
]);

Address::factory()->ofType(AddressType::Office)->make();

Factory zapisuje záznamy priamo — bez normalizácie krajiny, bez AddressCreated, bez rušenia primárneho príznaku ostatným adresám — a vždy vytvára triedu Address z balíka. Na PostgreSQL a SQLite čiastočný unikátny index aj tak odmietne druhú živú primárnu adresu v jednej skupine vlastník + typ.

Kompletný test

use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Addresses\Enums\AddressType;
use RoundlyConsulting\Addresses\Events\PrimaryAddressChanged;
use RoundlyConsulting\Addresses\Testing\InteractsWithAddresses;

uses(InteractsWithAddresses::class);

it('promotes a saved shipping address', function () {
    Event::fake([PrimaryAddressChanged::class]);

    $customer = Customer::factory()->create();
    $address = $customer->newAddress()
        ->type(AddressType::Shipping)
        ->in('Bratislava')->at('Somewhere 1')->postalCode('81101')->country('sk')
        ->save();

    $customer->setPrimaryAddress($address);

    $this->assertHasAddress($customer, ['country_iso' => 'SK']);
    $this->assertPrimaryAddress($customer, AddressType::Shipping);
    Event::assertDispatched(PrimaryAddressChanged::class);
});

Spúšťajte ho s bežným nastavením databázy (napríklad RefreshDatabase) a s publikovanou migráciou balíka. Vlastnú sadu testov balíka spustíte v jeho repozitári takto:

composer test

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.