Testovanie
Forms::fake() nahradí manažéra triedou FormsFake — zaznamenávajúcim podtypom FormsManager, takže platí aj pre injektovaných manažérov — a vráti ju ako váš handle. Operácie stále bežia nad databázou: očakávané riadky naozaj vzniknú, udalosti sa spustia a schvaľovanie stále otvorí svoju žiadosť. Fake navrch zaznamená každé volanie — cez fasádu, injektovaného manažéra, buildery, Forms::submission(), trait HasForms aj forms:sync:
use RoundlyConsulting\Approvals\Models\ApprovalRequest;
use RoundlyConsulting\Forms\Facades\Forms;
use RoundlyConsulting\Forms\Models\FormSubmission;
$fake = Forms::fake();
// ... exercise your application code that submits the form ...
$fake->assertSubmitted($form);
$fake->assertSubmitted($form, fn ($result, $form) => $result->fieldCount === 3);
$fake->assertSubmittedCount(1);
$fake->assertNotSubmitted($otherForm);
$fake->assertReviewOpened(fn (ApprovalRequest $request, FormSubmission $submission) => $request->quorum === 2);Všetky aserty
| Zaznamenáva | Aserty | Aserty „nič“ |
|---|---|---|
| submit(), $user->submitTo() | assertSubmitted(?Form, ?callable), assertSubmittedCount(int), assertNotSubmitted(?Form) | assertNothingSubmitted() |
| draft(), $user->draftTo() | assertDrafted(?Form, ?callable) | assertNothingDrafted() |
| finalize(), submission()->finalize() | assertFinalized(?string $uuid) | assertNothingFinalized() |
| define() | assertFormDefined(string $key) | assertNoFormDefined() |
| create(), define()->create() | assertFormCreated(?callable) | assertNoFormCreated() |
| update()->save() | assertFormUpdated(string $key) | assertNoFormUpdated() |
| createSubmission() | assertSubmissionCreated(?callable) | assertNoSubmissionCreated() |
| sync(), forms:sync | assertSynced() | assertNothingSynced() |
| review()->…->open() | assertReviewOpened(?callable) | assertNothingReviewed() |
use RoundlyConsulting\Approvals\Models\ApprovalRequest;
use RoundlyConsulting\Forms\DataTransferObjects\SubmissionResult;
use RoundlyConsulting\Forms\Models\Form;
use RoundlyConsulting\Forms\Models\FormSubmission;
use RoundlyConsulting\Forms\Models\Submission;
// submit(), $user->submitTo()
$fake->assertSubmitted($form, fn (SubmissionResult $result, Form $form) => $result->fieldCount === 3);
$fake->assertSubmittedCount(1);
$fake->assertNotSubmitted($otherForm);
$fake->assertNothingSubmitted();
// draft(), $user->draftTo()
$fake->assertDrafted($form, fn (SubmissionResult $result, Form $form) => $result->fieldCount > 0);
$fake->assertNothingDrafted();
// finalize(), Forms::submission($uuid)->finalize()
$fake->assertFinalized($draft->uuid);
$fake->assertNothingFinalized();
// define(), create(), update()->save()
$fake->assertFormDefined('contact');
$fake->assertNoFormDefined();
$fake->assertFormCreated(fn (Form $form) => $form->key === 'contact');
$fake->assertNoFormCreated();
$fake->assertFormUpdated('contact'); // only once save() has run
$fake->assertNoFormUpdated();
// createSubmission()
$fake->assertSubmissionCreated(fn (Submission $row) => $row->uuid === $uuid);
$fake->assertNoSubmissionCreated();
// sync(), php artisan forms:sync
$fake->assertSynced();
$fake->assertNothingSynced();
// review()->…->open()
$fake->assertReviewOpened(fn (ApprovalRequest $request, FormSubmission $submission) => $request->quorum === 2);
$fake->assertNothingReviewed();- assertSubmitted() a assertDrafted() porovnávajú podľa kľúča formulára; ich callbacky dostanú SubmissionResult a Form a pre jedno zaznamenané volanie musia vrátiť true.
- assertFormCreated() vidí formuláre uložené cez Forms::create() a define()->create(); formuláre vytvorené v rámci sync() splnia len assertSynced().
- assertFormDefined($key) prejde, ak bežalo define($key, …) alebo vznikol formulár s týmto kľúčom.
- Úprava sa zaznamená až pri save() — samotné Forms::update($key) nezaznamená nič, takže assertFormUpdated() prejde až po save().
- Callbacky assertReviewOpened() dostanú ApprovalRequest a FormSubmission.
Testovacie pomocníky
Trait InteractsWithForms pridáva fakeForms(), submitForm($form, $values, $sender) a draftForm(...). Hodnoty sú vnorené podľa skupín alebo ploché podľa group_key.field_key (v jednej skupine jeden štýl) — kľúč formulára doplní pomocník za vás:
uses(RoundlyConsulting\Forms\Testing\InteractsWithForms::class);
$fake = $this->fakeForms();
$this->submitForm($form, ['details' => ['name' => 'Ann']]);
$this->submitForm($form, ['details.name' => 'Ann']); // the same submission, flat
$fake->assertSubmitted($form);Pest matchery
Matchery pre expect() zapnete v tests/Pest.php:
RoundlyConsulting\Forms\Testing\FormExpectations::register();
expect($form)->toBeAcceptingSubmissions();
expect($expiredForm)->toBeExpired();Úplný príklad
use RoundlyConsulting\Forms\Facades\Forms;
use RoundlyConsulting\Forms\GroupBuilder;
it('stores a contact submission', function () {
$fake = Forms::fake();
$form = Forms::define('contact', 'Contact us')
->public()
->group('details', 'Details', function (GroupBuilder $g): void {
$g->field('name', 'Name')->required();
})
->create();
$this->post('/contact', ['contact' => ['details' => ['name' => 'Ann']]])
->assertRedirect();
$fake->assertSubmitted($form, fn ($result) => $result->fieldCount === 1);
expect(Forms::submissions($form)->first()->value('name'))->toBe('Ann');
});Factories
Každý model má factory so stavmi pre bežné prípady:
use RoundlyConsulting\Forms\Models\Form;
use RoundlyConsulting\Forms\Models\FormSubmission;
use RoundlyConsulting\Forms\Models\Submission;
Form::factory()->public()->create();
Form::factory()->withExpiration()->create();
Submission::factory()->draft()->create();
FormSubmission::factory()->pending()->create();Testy spúšťajte s načítanými migráciami formulárov (aj závislých balíkov), napríklad cez RefreshDatabase. Vlastné testy balíka spustíte takto:
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.