Testovanie
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();| Asercia | Opak |
|---|---|
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;
}| Asercia | Prejde, 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 testPrejavte 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.