Detailed explanation of how to test laravel commands
Introduction
I recently used laravel's consolo command line tool. When I was writing commands and wanted to write some tests, I found that the official documentation did not mention the command test method. It took me some time to find information over the wall, and I successfully implemented it and recorded it for the convenience of more people.
Recommended: "laravel tutorial"
Testing method
Everyone knows that Laravel uses many mature components of Symfony , Laravel's console component uses Symfony/console.
Fortunately, the Symfony/console component provides CommandTester for command testing. The usage is as follows
... use FooCommand; use Symfony\Component\Console\Application; use Symfony\Component\Console\Tester\CommandTester; ... public function testSample(){ //创建一个console测试应用平台,用来搭载测试的命令 $application = new Application(); //创建待测试的command $testedCommand = $this->app->make(FooCommand::class); //设置命令执行需要的laravel依赖 $testedCommand->setLaravel(app()); //添加待测试的command到测试应用上 //同时command 也绑定 application $application->add($testedCommand); //实例化命令测试类 $commandTester = new CommandTester($testedCommand); //命令输入流,对应每次交互需要提供的输入内容 $commandTester->setInputs([ //... ]); //执行命令 $commandTester->execute(['command' => $testedCommand->getName()]); //对命令执行结果进行断言测试,主要是依靠正则判断 //$commandTester->getDisplay() 方法可以获取命令执行后的输出结果 $this->assertRegExp("/some reg/", $commandTester->getDisplay()); }
Example
We now have A command to manually create a new user, createUser, is used to create a user manually.
It is necessary to interactively allow users to enter name, email, password, comfirm password, and these data.
Command to be tested
<?php namespace App\Console\Commands; use App\User; use Illuminate\Auth\Events\Registered; use Illuminate\Console\Command; use Illuminate\Support\Facades\Validator; class CreateUser extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'createUser'; /** * The console command description. * * @var string */ protected $description = 'create new user for system manually'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $this->line($this->description); // 获取输入的数据 $data = [ 'name' => $this->ask('What\'s your name?'), 'email' => $this->ask('What\'s your email?'), 'password' => $this->secret('What\'s your password?'), 'password_confirmation' => $this->secret('Pleas confirm your password.') ]; // 验证输入内容 $validator = $this->makeValidator($data); if ($validator->fails()) { foreach ($validator->errors()->toArray() as $error) { foreach ($error as $message) { $this->error($message); } } return; } // 向用户确认输入信息 if (!$this->confirm('Confirm your info: ' . PHP_EOL . 'name:' . $data['name'] . PHP_EOL . 'email:' . $data['email'] . PHP_EOL . 'is this correct?')) { return; } // 注册 $user = $this->create($data); event(new Registered($user)); $this->line('User ' . $user->name . ' successfully registered'); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function makeValidator($data) { return Validator::make($data, [ 'name' => 'required|string|max:255|unique:users', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed' ]); } /** * Create a new user instance after a valid registration. * * @param array $data * @return \App\User */ protected function create($data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']) ]); } }
Correct result
If the information is entered correctly, you will get the following output
$ path-to-your-app/app# php artisan createUser create new user for system manually What's your name?: > vestin What's your email?: > correct@abc.com What's your password?: > Pleas confirm your password.: > Confirm your info: name:vestin email:correct@abc.com is this correct? (yes/no) [no]: > yes User vestin successfully registered
What I want to test
I want to test two pieces of content:
1. Data input verification test
● email Validity test
● Test whether the password entered twice is the same
2. Correctly create user test
● Write unit test
<?php namespace Tests\Unit\command; use App\Console\Commands\CreateUser; use Symfony\Component\Console\Application; use Symfony\Component\Console\Tester\CommandTester; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; class CreateUserTest extends TestCase { use RefreshDatabase; /** * 测试数据验证 * * @return void */ public function testValidation() { $application = new Application(); $testedCommand = $this->app->make(CreateUser::class); $testedCommand->setLaravel(app()); $application->add($testedCommand); $commandTester = new CommandTester($testedCommand); $commandTester->setInputs(['Vestin', 'badEmail@abc', '123456', '654321']); $commandTester->execute(['command' => $testedCommand->getName()]); // assert $this->assertRegExp("/The email must be a valid email address/", $commandTester->getDisplay()); $commandTester->setInputs(['vestin', 'correct@abc.com', '123456', '654321']); $commandTester->execute(['command' => $testedCommand->getName()]); // assert $this->assertRegExp("/The password confirmation does not match/", $commandTester->getDisplay()); } /** * 测试成功注册用户 * * @return void */ public function testSuccess() { $application = new Application(); $testedCommand = $this->app->make(CreateUser::class); $testedCommand->setLaravel(app()); $application->add($testedCommand); $commandTester = new CommandTester($testedCommand); $commandTester->setInputs(['Vestin', 'correct@abc.com', '123456', '123456', 'y']); $commandTester->execute(['command' => $testedCommand->getName()]); // assert $this->assertRegExp("/User Vestin successfully registered/", $commandTester->getDisplay()); $this->assertDatabaseHas('users', [ 'email' => 'correct@abc.com', 'name' => 'Vestin' ]); } }
Execute test
$ path-to-your-app/app# ./vendor/bin/phpunit PHPUnit 6.4.3 by Sebastian Bergmann and contributors. .. 3 / 3 (100%) Time: 659 ms, Memory: 14.00MB
The above is the detailed content of Detailed explanation of how to test laravel commands. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Laravel - Artisan Commands - Laravel 5.7 comes with new way of treating and testing new commands. It includes a new feature of testing artisan commands and the demonstration is mentioned below ?

Laravel - Pagination Customizations - Laravel includes a feature of pagination which helps a user or a developer to include a pagination feature. Laravel paginator is integrated with the query builder and Eloquent ORM. The paginate method automatical

Method for obtaining the return code when Laravel email sending fails. When using Laravel to develop applications, you often encounter situations where you need to send verification codes. And in reality...

Laravel schedule task run unresponsive troubleshooting When using Laravel's schedule task scheduling, many developers will encounter this problem: schedule:run...

The method of handling Laravel's email failure to send verification code is to use Laravel...

How to implement the table function of custom click to add data in dcatadmin (laravel-admin) When using dcat...

Laravel - Dump Server - Laravel dump server comes with the version of Laravel 5.7. The previous versions do not include any dump server. Dump server will be a development dependency in laravel/laravel composer file.

The impact of sharing of Redis connections in Laravel framework and select methods When using Laravel framework and Redis, developers may encounter a problem: through configuration...
