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