Overview Laravel 11.21 introduces significant quality-of-life improvements focused on testing ergonomics and database management. These updates refine how developers handle HTTP headers in tests, simplify CLI choice assertions, and provide more expressive ways to verify model existence in the database. By reducing boilerplate, these features keep test suites readable and maintainable. Prerequisites To follow this guide, you should be familiar with the Laravel framework, specifically **PHPUnit** or **Pest** for testing. Understanding Eloquent models and the basics of **Artisan** commands is essential. Key Libraries & Tools - **Laravel 11.21**: The latest framework release featuring these updates. - **Laravel Prompts**: The library powering interactive CLI feedback. - **Eloquent ORM**: The database layer managing soft deletes and model destruction. Code Walkthrough Batch Header Removal Previously, you had to chain multiple `withoutHeader` calls. Now, you can pass an array of headers to be ignored in one go. ```python // Before: Chained methods $response = $this->withoutHeader('X-First')->withoutHeader('X-Second')->get('/'); // Now: Single array call $response = $this->withoutHeaders(['X-First', 'X-Second'])->get('/'); ``` Streamlined DB Assertions Testing for a specific model's presence in the database is now more intuitive. By passing a model instance as the first argument to `assertDatabaseHas`, Laravel automatically infers the table and constraints by the model's primary key. ```python $podcast = Podcast::factory()->create(); // New shorthand: No second argument needed $this->assertDatabaseHas($podcast); ``` Force Destroying Soft Deletes When using soft deletes, the standard `destroy` method merely sets a `deleted_at` timestamp. Laravel 11.21 introduces `forceDestroy` to bypass the soft-delete layer and permanently remove records via the class name. ```python // Permanently removes ID 1, ignoring soft delete logic Podcast::forceDestroy(1); ``` Syntax Notes In the new `expectsChoice` assertion, you can now pass an associative array directly as the options list. This aligns the test syntax with the `select` prompt syntax used in the Laravel Prompts package, making your test code a mirror image of your implementation code. Practical Examples - **Clean CLI Testing**: Use `expectsChoice` with identical option arrays in both your command and your test to ensure user interaction logic is robust. - **Testing Deletion Flows**: Use `forceDestroy` in your cleanup routines or specific administrative tests where a soft delete is insufficient for the test case scenario. Tips & Gotchas Be careful when passing a model to `assertDatabaseHas`. If you provide a model instance but then manually specify different data in the second argument, the data in the second argument will overwrite the constraints inferred from the model. Always ensure the model instance you pass is the exact record you intend to verify.
Patrick
People
- Sep 10, 2024
- Jul 2, 2024