Testovanie
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
| Asercia | Opak | Callback 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 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.