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

Reviews::fake() nasadí zaznamenávajúci ReviewsFake — podtyp ReviewsManager, takže ho dostane aj injektovaný manažér — a vráti ho. Operácie naďalej bežia proti databáze, takže čítania, agregáty aj udalosti sa správajú normálne, a každá zmena sa zaznamená — či prišla cez fasádu, injektovaný manažér, builder for()->by(), traity HasReviews / CanVoteOnReviews alebo metódu modelu Review:

use RoundlyConsulting\Reviews\Facades\Reviews;
use RoundlyConsulting\Reviews\Models\Review;

it('records the review and the owner reply', function () {
    $fake = Reviews::fake();

    $restaurant = Restaurant::factory()->create();
    [$user, $owner] = User::factory()->count(2)->create();

    $review = $restaurant->addReview($user)->rating(5)->create();
    $review->respond($owner, 'Thanks!');

    $fake->assertReviewCreated();
    $fake->assertReviewCreated(fn (Review $review) => $review->rating === 5);
    $fake->assertReviewResponded(fn (Review $response, Review $parent) => $parent->is($review));
    $fake->assertNothingApproved();
});

Všetky asercie

AserciaOpakCallback dostane
assertReviewCreated()assertNothingReviewed()recenzia
assertReviewApproved()assertNothingApproved()recenzia
assertReviewRejected()assertNothingRejected()recenzia
assertReviewUpdated()assertNothingUpdated()recenzia
assertReviewDeleted()assertNothingDeleted()recenzia
assertReviewResponded()assertNothingResponded()odpoveď, pôvodná recenzia
assertReviewVoted()assertNothingVoted()recenzia, hlasujúci
assertReviewVoteRemoved()assertNoVoteRemoved()recenzia, hlasujúci
assertReviewVerified()assertNothingVerified()recenzia
assertReviewUnverified()assertNothingUnverified()recenzia
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Reviews\Models\Review;

$fake->assertReviewCreated(fn (Review $review) => $review->verified);
$fake->assertReviewApproved(fn (Review $review) => $review->is($pending));
$fake->assertReviewRejected();
$fake->assertReviewUpdated();
$fake->assertReviewDeleted();
$fake->assertReviewResponded(fn (Review $response, Review $parent) => $parent->is($review));
$fake->assertReviewVoted(fn (Review $review, Model $voter) => $voter->is($user));
$fake->assertReviewVoteRemoved(fn (Review $review, Model $voter) => $voter->is($user));
$fake->assertReviewVerified();
$fake->assertReviewUnverified();

// The opposites pass when nothing of that kind was recorded:
$fake->assertNothingReviewed();
$fake->assertNothingApproved();
$fake->assertNothingRejected();
$fake->assertNothingUpdated();
$fake->assertNothingDeleted();
$fake->assertNothingResponded();
$fake->assertNothingVoted();
$fake->assertNoVoteRemoved();
$fake->assertNothingVerified();
$fake->assertNothingUnverified();

Každá metóda assert*() prijíma voliteľný callback a prejde, ak aspoň jedno zaznamenané volanie vráti true. Zaznamenajú sa len volania, ktoré niečo zmenia: schválenie schválenej recenzie, zamietnutie zamietnutej, overenie overenej (či zrušenie overenia neoverenej) a stiahnutie hlasu, ktorý nikdy nevznikol, sú bez účinku — bez zápisu a bez udalosti — preto sa nezaznamenajú. Volanie update(), ktoré zmení príznak verified, sa zaznamená aj ako overenie alebo zrušenie overenia. Keďže operácie skutočne bežia, majte načítané migrácie balíka (RefreshDatabase).

Pest expectations

Matchery zaregistrujte raz v tests/Pest.php:

// tests/Pest.php
RoundlyConsulting\Reviews\Testing\ReviewExpectations::register();

// In any test:
expect($product)->toHaveReview();
expect($product)->toHaveReview($author);
expect($product)->toHaveApprovedReview();

Oba matchery sledujú len recenzie najvyššej úrovne, odpovede vlastníka ich teda nikdy nesplnia.

InteractsWithReviews

Pridajte trait do testovacieho prípadu a získate pohodlné actingAsReviewer() / reviewAs():

use RoundlyConsulting\Reviews\Testing\InteractsWithReviews;

uses(InteractsWithReviews::class);

it('queues a new review for moderation', function () {
    $review = $this->actingAsReviewer(User::factory()->create())
        ->reviewAs(Restaurant::factory()->create(), rating: 4, content: 'Great brunch');

    expect($review->isPending())->toBeTrue();
});

Továrne

Oba modely majú továrne so stavmi pre každý typ recenzie. Vytvárajú nakonfigurovaný reviews.model / reviews.vote_model, takže vymenený model dostane vlastné riadky:

use RoundlyConsulting\Reviews\Models\Review;
use RoundlyConsulting\Reviews\Models\ReviewVote;

$review = Review::factory()
    ->forReviewable($restaurant)
    ->byAuthor($user)
    ->approved()
    ->verified()
    ->rating(5)
    ->create();

Review::factory()->response($review)->byAuthor($owner)->approved()->create();
Review::factory()->forReviewable($restaurant)->withoutRating()->pending()->create();
Review::factory()->forReviewable($restaurant)->helpfulVotes(12, 3)->create();

ReviewVote::factory()->forReview($review)->byVoter($user)->unhelpful()->create();

Továrne zapisujú riadky priamo — obchádzajú validáciu, moderovanie aj udalosti. Ak testované správanie od nich závisí, použite fasádu.

Vlastné testy balíka

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.