| title | Testing |
|---|---|
| description | Testing your console application with Pest |
Laravel Zero is built with testing in mind. Every application ships with a tests directory containing a Pest test suite, a Feature suite that boots the full application, and a Unit suite for everything else.
Your test cases extend Tests\TestCase, which itself extends LaravelZero\Framework\Testing\TestCase. This gives you the same testing experience you are used to in Laravel, adapted to the console.
To create a new test case, use the make:test Artisan command. By default, tests will be placed in the tests/Feature directory:
php application make:test SendEmailsTestIf you would like to create a test within the tests/Unit directory, you may use the --unit option:
php application make:test SendEmailsTest --unitYou may run your tests using the test Artisan command:
php application testAny argument that may be passed to Pest may also be passed to the test command:
php application test --filter=inspireOf course, you may also invoke Pest directly:
./vendor/bin/pestNote: The
testcommand is only registered when your application is not running in theproductionenvironment, so it will never appear in a build of your application.
Laravel Zero provides Laravel's artisan test method, which allows you to easily test your commands. Using the expectsOutput, expectsQuestion, expectsConfirmation, and assertExitCode methods, you may write expressive tests for your commands' entire interaction with the user:
it('inspires artisans', function () {
$this->artisan('inspire')
->expectsOutput('Simplicity is the ultimate sophistication.')
->assertExitCode(0);
});Interactive commands may be tested by describing the answers the user provides:
it('creates a user', function () {
$this->artisan('user:create')
->expectsQuestion('What is your name?', 'Taylor')
->expectsConfirmation('Do you wish to continue?', 'yes')
->expectsOutput('User created successfully.')
->assertSuccessful();
});For a complete list of the available assertions, consult the console tests documentation on the Laravel website.
Laravel Zero records every command executed through the call and callSilently methods. This allows you to assert that a command dispatched the commands you expected, without asserting on their output:
it('migrates the database before importing', function () {
$this->artisan('movies:import');
$this->assertCommandCalled('migrate', ['--force' => true]);
});The inverse assertion is available through the assertCommandNotCalled method:
$this->assertCommandNotCalled('migrate:fresh');