Δοκιμές
Το Queuety παρέχει μια κλάση QueueFake που αντικαθιστά την πραγματική ουρά με ένα αποθηκευτικό μέσο στη μνήμη. Οι εργασίες που αποστέλλονται καταγράφονται αντί να γράφονται στη βάση δεδομένων, ενώ το create_batch() καταγράφει επίσης τα μεταδεδομένα δέσμης στη μνήμη. Έτσι μπορείτε να ελέγχετε τη συμπεριφορά αποστολής χωρίς να εκτελείτε worker ή να γράφετε στη βάση δεδομένων. Η αποστολή με όνομα χειριστή εξακολουθεί να εντοπίζει τον χειριστή μέσω του μητρώου, επομένως καλέστε πρώτα το Queuety::init() για αποστολή με συμβολοσειρά χειριστή. Οι παρουσίες Contracts\Job, τα chain(), τα create_batch() και τα batch() λειτουργούν χωρίς αυτό.
Ρύθμιση της προσομοιωμένης ουράς
Καλέστε το Queuety::fake() στην αρχή της δοκιμής σας. Επιστρέφει μια παρουσία QueueFake που καταγράφει όλες τις επόμενες αποστολές.
use Queuety\Queuety;
class SendEmailTest extends \PHPUnit\Framework\TestCase {
protected function setUp(): void {
$this->fake = Queuety::fake();
}
protected function tearDown(): void {
Queuety::reset();
}
}
Το Queuety::fake() δημιουργεί ένα νέο QueueFake και το συνδέει με το facade Queuety. Τα Queuety::dispatch() και Dispatchable::dispatch() καταγράφουν τις εργασίες που προστέθηκαν. Το Queuety::chain() καταγράφει κάθε εργασία αλυσίδας ως κανονική προσθήκη, με τη σειρά αποστολής. Το Queuety::create_batch() καταγράφει τόσο τις εργασίες που προστέθηκαν όσο και τα μεταδεδομένα δέσμης που χρησιμοποιεί το assert_batched(). Το Queuety::batch() καταγράφει τις εργασίες που προστέθηκαν, αλλά δεν δημιουργεί προσομοιωμένα μεταδεδομένα δέσμης.
Καλέστε το Queuety::reset() στο tearDown() για να εκκαθαρίσετε την προσομοιωμένη ουρά μεταξύ δοκιμών. Εκκαθαρίζει όλη την κατάσταση του facade, επομένως καλέστε ξανά το Queuety::init() αν μια επόμενη δοκιμή χρειάζεται την πραγματική ουρά.
Έλεγχος ότι προστέθηκαν εργασίες
assert_pushed()
Ελέγξτε ότι μια συγκεκριμένη κλάση εργασίας αποστάλθηκε τουλάχιστον μία φορά.
public function test_welcome_email_is_sent(): void {
$this->fake = Queuety::fake();
// Code under test...
register_new_user( 'user@example.com' );
$this->fake->assert_pushed( SendWelcomeEmailJob::class );
}
Περάστε προαιρετικά μια συνάρτηση επανάκλησης για φιλτράρισμα βάσει payload ή άλλων χαρακτηριστικών. Η συνάρτηση λαμβάνει τον καταγεγραμμένο πίνακα δεδομένων εργασίας με τα κλειδιά handler, payload, queue και instance. Το instance είναι null για εργασίες που αποστέλλονται μέσω του facade ή του trait Dispatchable, επομένως κάντε αντιστοίχιση με τα handler και payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Ελέγξτε ότι μια εργασία προστέθηκε ακριβώς συγκεκριμένο αριθμό φορών.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Ελέγξτε ότι μια εργασία δεν αποστάλθηκε ποτέ.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Ελέγξτε ότι δεν αποστάλθηκαν καθόλου εργασίες.
public function test_no_jobs_on_invalid_input(): void {
$this->fake = Queuety::fake();
process_input( '' ); // invalid, should not dispatch anything
$this->fake->assert_nothing_pushed();
}
Έλεγχος δεσμών
assert_batched()
Ελέγξτε ότι αποστάλθηκε μια δέσμη. Προαιρετικά, περάστε μια συνάρτηση επανάκλησης για φιλτράρισμα βάσει του περιεχομένου της δέσμης.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
Η συνάρτηση επανάκλησης λαμβάνει έναν πίνακα με τα κλειδιά jobs και options.
Εξέταση εργασιών που προστέθηκαν
Χρησιμοποιήστε το pushed() για να ανακτήσετε όλες τις καταγεγραμμένες αποστολές μιας συγκεκριμένης κλάσης και το batches() για να ανακτήσετε όλες τις καταγεγραμμένες δέσμες.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Επαναφορά μεταξύ δοκιμών
Καλέστε το reset() στην προσομοιωμένη ουρά για να εκκαθαρίσετε όλες τις καταγεγραμμένες εργασίες και δέσμες χωρίς να δημιουργήσετε νέα παρουσία.
$this->fake->reset();
Εναλλακτικά, καλέστε το Queuety::reset() για να καταργήσετε πλήρως την προσομοιωμένη ουρά και όλη την εσωτερική της κατάσταση.
Πλήρες παράδειγμα
use PHPUnit\Framework\TestCase;
use Queuety\Queuety;
class OrderWorkflowTest extends TestCase {
private \Queuety\Testing\QueueFake $fake;
protected function setUp(): void {
$this->fake = Queuety::fake();
}
protected function tearDown(): void {
Queuety::reset();
}
public function test_order_dispatches_payment_job(): void {
$order = create_order( [ 'total' => 99.99 ] );
$this->fake->assert_pushed( ProcessPaymentJob::class, function ( array $job ) use ( $order ) {
return $job['payload']['order_id'] === $order->id;
} );
$this->fake->assert_not_pushed( RefundJob::class );
}
public function test_bulk_import_dispatches_batch(): void {
start_bulk_import( $rows );
$this->fake->assert_batched( function ( array $batch ) use ( $rows ) {
return count( $batch['jobs'] ) === count( $rows );
} );
}
public function test_nothing_dispatched_without_data(): void {
process_empty_queue();
$this->fake->assert_nothing_pushed();
}
}