Testovanie
Comments::fake() nasadí zaznamenávajúci CommentsFake — za fasádu aj do kontajnera, takže ho dostanú aj vložené CommentsManager. Každú operáciu stále vykoná — záznamy sa zapíšu, policy a zámky platia, udalosti sa odošlú — a zaznamená každú úspešnú zmenu bez ohľadu na to, odkiaľ prišla: z fasády, vloženého manažéra, buildera, hromadného moderovania v query, $user->writeComment() či $comment->lockReplies():
use RoundlyConsulting\Comments\Facades\Comments;
use RoundlyConsulting\Comments\Models\Comment;
$fake = Comments::fake();
// ... run the code under test ...
$fake->assertPosted(fn (Comment $comment) => $comment->comment === 'Hi');
$fake->assertApproved($comment);
$fake->assertLocked($post);
$fake->assertThreadLocked();
$fake->assertNothingDeleted();Všetky asercie
Každá asercia prijme voliteľný model (porovnaný cez is()) alebo callback, ktorý pri zhode vráti true; bez argumentu prejde akékoľvek zaznamenané volanie. Po nasadení fake ich môžete volať aj staticky, napr. Comments::assertPosted():
| Zaznamená ho | Asercia | Asercia „nič“ |
|---|---|---|
on()->post(), write(), writeComment() | assertPosted() | assertNothingPosted() |
update() | assertUpdated() | assertNothingUpdated() |
delete(), deleteAll() | assertDeleted() | assertNothingDeleted() |
restore() | assertRestored() | assertNothingRestored() |
approve(), approveAll() | assertApproved() | assertNothingApproved() |
hide(), hideAll() | assertHidden() | assertNothingHidden() |
lock($subject) | assertLocked() | assertNothingLocked() |
unlock($subject) | assertUnlocked() | assertNothingUnlocked() |
lockThread(), lockReplies() | assertThreadLocked() | assertNothingThreadLocked() |
unlockThread(), unlockReplies() | assertThreadUnlocked() | assertNothingThreadUnlocked() |
$fake = Comments::fake();
$user->writeComment($post, 'Hi'); // recorded by the trait path too
Comments::update($comment, 'Edited');
Comments::for($post)->pending()->approveAll(); // one record per approved row
Comments::hide($spam);
Comments::delete($old);
Comments::restore($old);
Comments::lock($post);
Comments::unlock($post);
$comment->lockReplies();
$comment->unlockReplies();
$fake->assertPosted(fn (Comment $c) => $c->comment === 'Hi');
$fake->assertUpdated($comment);
$fake->assertApproved(); // any approval at all
$fake->assertHidden($spam);
$fake->assertDeleted($old);
$fake->assertRestored($old);
$fake->assertLocked($post);
$fake->assertUnlocked(fn ($subject) => $subject->is($post));
$fake->assertThreadLocked($comment);
$fake->assertThreadUnlocked($comment);
// In a test where nothing should change:
$fake->assertNothingPosted();
$fake->assertNothingUpdated();
$fake->assertNothingDeleted();
$fake->assertNothingRestored();
$fake->assertNothingApproved();
$fake->assertNothingHidden();
$fake->assertNothingLocked();
$fake->assertNothingUnlocked();
$fake->assertNothingThreadLocked();
$fake->assertNothingThreadUnlocked();Volanie, ktoré vyhodí výnimku, nezaznamená nič. Listener automatického skrytia moderuje v mene systému bez používateľa, preto manažér obchádza a nezaznamenáva sa — CommentHidden overte cez Event::fake().
Stavy factory
Factory modelu Comment obsahuje stavy pre každý typ komentára — on($subject), pending(), hidden(), locked(), reply($parent) a by($author). Komentár potrebuje subjekt, preto každý komentár z factory dostane on($subject) alebo reply($parent), prípadne for($subject, 'commentable') z Eloquentu:
use RoundlyConsulting\Comments\Models\Comment;
$root = Comment::factory()->on($post)->create();
Comment::factory()->on($post)->pending()->create();
Comment::factory()->on($post)->hidden()->create();
Comment::factory()->on($post)->locked()->create();
Comment::factory()->reply($root)->by($user)->create(); // inherits the root's subject
Comment::factory()->for($post, 'commentable')->create(); // the plain Eloquent form works tooDatabázové asercie
V testovacej triede použite trait AssertsComments pre čitateľné očakávania:
namespace Tests\Feature;
use App\Models\Post;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use RoundlyConsulting\Comments\Facades\Comments;
use RoundlyConsulting\Comments\Testing\AssertsComments;
use Tests\TestCase;
final class PostCommentsTest extends TestCase
{
use AssertsComments;
use RefreshDatabase;
public function test_a_user_can_comment_on_a_post(): void
{
$post = Post::factory()->create();
$user = User::factory()->create();
Comments::on($post)->as($user)->body('expected body')->post();
$this->assertCommented($post);
$this->assertCommented($post, 'expected body');
$this->assertCommentCount($post, 1);
}
public function test_a_new_post_has_no_comments(): void
{
$this->assertNotCommented(Post::factory()->create());
}
}Asercie počítajú každý nezmazaný komentár na subjekte bez ohľadu na jeho stav či hĺbku.
Fake udalosti
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Comments\Events\CommentApproved;
use RoundlyConsulting\Comments\Events\CommentCreated;
use RoundlyConsulting\Comments\Facades\Comments;
Event::fake([CommentCreated::class, CommentApproved::class]);
$comment = Comments::on($post)->as($user)->body('Hello')->post();
Comments::approve($comment);
Event::assertDispatched(CommentCreated::class, fn ($e) => $e->comment->is($comment));
Event::assertDispatched(CommentApproved::class);Testy spúšťajte s publikovanými migráciami balíka — aj Likes, Reports, Approvals a Media Library — napríklad cez RefreshDatabase.
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 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.