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

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á hoAserciaAsercia „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 too

Databá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 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.