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ú. 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:

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.