Testovanie
Teams::fake() vloží RoundlyConsulting\Teams\Testing\TeamsFake — zaznamenávajúcu podtriedu TeamsManager — za fasádu aj za väzbu TeamsManager v kontajneri a vráti ju. Operácie sa naďalej vykonajú v testovacej databáze; fake každú zaznamená, takže môžete overiť, o čo váš kód požiadal:
use RoundlyConsulting\Teams\DataTransferObjects\CreateTeamData;
use RoundlyConsulting\Teams\Facades\Teams;
it('creates a team and adds an admin', function () {
$fake = Teams::fake(); // TeamsFake — also swapped in for an injected TeamsManager
$owner = User::factory()->create();
$alice = User::factory()->create();
$bob = User::factory()->create();
$team = Teams::create(new CreateTeamData(name: 'Acme', owner: $owner));
Teams::for($team)->members()->add($alice, 'admin');
$team->addMember($bob, 'member'); // a model method — recorded too
$fake->assertTeamCreated('Acme');
Teams::assertMemberAdded($team, $alice, 'admin'); // the facade forwards to the fake
Teams::assertMemberAdded($team, $bob);
Teams::assertNothingRemoved();
expect($alice)->toBeMemberOf($team); // the operation really ran
});Každá zmena stavu prechádza jednou metódou managera, takže fake vidí volania cez fasádu, injektovaný TeamsManager, všetky handly, metódy modelov ($team->addMember(), $invite->revoke(), $membership->removeFromTeam()), Artisan príkazy aj listener schvaľovania. Asercie voláte na vrátenom fake objekte alebo cez fasádu.
- Zaznamená sa len operácia, ktorú ste zavolali, nie to, čo robí vnútri — prijatie pozvánky sa zapíše ako prijatie, nie ako pridanie člena, ktoré v ňom prebehne.
- Odmietnuté volanie (pozvánka iného tímu, nečlen) vyhodí výnimku ešte pred vykonaním a nezaznamená sa.
- Registrácia globálnych rolí a oprávnení je konfigurácia pri štarte a nezaznamenáva sa; Teams::members()->expiring() je len čítanie, takže tiež nie.
- Priame volanie akcie obíde manager, preto ho fake nevidí.
Všetky asercie
| Operácia | Asercia | Negatívna asercia |
|---|---|---|
create() | assertTeamCreated(?name) | assertNothingCreated() |
transferOwnershipTo() | assertOwnershipTransferred($team, ?to) | assertNothingTransferred() |
members()->add() | assertMemberAdded($team, $member, ?role), assertMemberNotAdded($team, $member) | assertNothingAdded() |
members()->remove() | assertMemberRemoved($team, $member) | assertNothingRemoved() |
members()->changeRole() | assertRoleChanged($team, $member, ?role) | assertNoRoleChanged() |
invites()->create() | assertInviteCreated($team, ?email) | assertNothingInvited() |
invites()->resend() | assertInviteResent($invite) | assertNothingResent() |
invites()->revoke() | assertInviteRevoked($invite) | assertNothingRevoked() |
invites()->accept() | assertInviteAccepted(?invite, ?by) | assertNothingAccepted() |
joinRequests()->open() | assertJoinRequested($team, ?requester) | assertNothingRequested() |
joinRequests()->approve() | assertJoinRequestApproved($request, ?by) | assertNothingApproved() |
joinRequests()->deny() | assertJoinRequestDenied($request, ?by) | assertNothingDenied() |
roles()->define() | assertRoleDefined($team, ?key) | assertNothingDefined() |
members()->notifyExpiring() | assertExpiringMembersNotified() | assertNothingNotified() |
invites()->prune(), members()->prune(), joinRequests()->expire() | assertInvitesPruned(), assertMembersPruned(), assertJoinRequestsExpired() | assertNothingPruned() |
| čokoľvek | recorded(?TeamOperation) | assertNothingRecorded() |
use RoundlyConsulting\Teams\Enums\TeamOperation;
use RoundlyConsulting\Teams\Facades\Teams;
// Teams
Teams::assertTeamCreated('Acme'); // name optional
Teams::assertOwnershipTransferred($team, to: $alice);
Teams::assertNothingCreated();
Teams::assertNothingTransferred();
// Members
Teams::assertMemberAdded($team, $alice, 'admin'); // role optional
Teams::assertMemberNotAdded($team, $carol);
Teams::assertMemberRemoved($team, $bob);
Teams::assertRoleChanged($team, $alice, 'editor'); // role optional
Teams::assertExpiringMembersNotified();
Teams::assertNothingAdded();
Teams::assertNothingRemoved();
Teams::assertNoRoleChanged();
Teams::assertNothingNotified();
// Invites
Teams::assertInviteCreated($team, '[email protected]'); // email optional
Teams::assertInviteResent($invite);
Teams::assertInviteRevoked($invite);
Teams::assertInviteAccepted($invite, by: $user); // both optional
Teams::assertNothingInvited();
Teams::assertNothingResent();
Teams::assertNothingRevoked();
Teams::assertNothingAccepted();
// Join requests and per-team roles
Teams::assertJoinRequested($team, $user); // requester optional
Teams::assertJoinRequestApproved($request, by: $admin);
Teams::assertJoinRequestDenied($request, by: $admin);
Teams::assertRoleDefined($team, 'editor'); // key optional
Teams::assertNothingRequested();
Teams::assertNothingApproved();
Teams::assertNothingDenied();
Teams::assertNothingDefined();
// Housekeeping
Teams::assertInvitesPruned();
Teams::assertMembersPruned();
Teams::assertJoinRequestsExpired();
Teams::assertNothingPruned();
// Anything
Teams::recorded(); // list<RecordedTeamOperation>
Teams::recorded(TeamOperation::AddMember); // only one operation
Teams::assertNothingRecorded();Zaznamenané operácie
recorded() vracia objekty RecordedTeamOperation — operáciu, kontext volania a jeho výsledok — s pomocníkmi na čítanie kontextu (kľúče ako team, member, role, invite, email, requester, request, by a key):
use RoundlyConsulting\Teams\Enums\TeamOperation;
$op = Teams::recorded(TeamOperation::AddMember)[0];
$op->operation; // TeamOperation::AddMember
$op->result; // the Member the call returned
$op->model('member'); // ?Model from the call's context
$op->involves('team', $team); // bool
$op->string('role'); // ?string — 'admin'Pest matchery
Tri expectation matchery zaregistrujete v tests/Pest.php — zavolajte TeamExpectations::register() alebo pripojte súbor publikovaný cez teams-stubs:
// tests/Pest.php
use RoundlyConsulting\Teams\Testing\TeamExpectations;
TeamExpectations::register();
// or, after publishing teams-stubs:
require __DIR__.'/Teams.php';expect($user)
->toBeMemberOf($team)
->withRole($team, 'admin')
->toHaveTeamPermission($team, 'posts.publish');Factories
Každý model má factory so stavmi pre prípady životného cyklu:
use RoundlyConsulting\Teams\Models\Invite;
use RoundlyConsulting\Teams\Models\JoinRequest;
use RoundlyConsulting\Teams\Models\Member;
use RoundlyConsulting\Teams\Models\Team;
Team::factory()->create();
Member::factory()->expired()->create();
Member::factory()->expiringAt(now()->addDays(5))->create();
Invite::factory()->maxUses(5)->forEmail('[email protected]')->create();
Invite::factory()->expired()->create();
JoinRequest::factory()->expiringWithin(3)->create();
JoinRequest::factory()->expired()->create();Factories členov a žiadostí vypĺňajú morph stĺpce zástupnými hodnotami — ak potrebujete skutočný model, zadajte member_type a member_id (alebo requester_type a requester_id).
Testy samotného balíka
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.