>  기사  >  PHP 프레임워크  >  laravel 명령을 테스트하는 방법에 대한 자세한 설명

laravel 명령을 테스트하는 방법에 대한 자세한 설명

藏色散人
藏色散人앞으로
2020-04-13 13:57:585047검색

소개

최근에 laravel의 consolo 명령줄 도구를 사용했는데, 명령을 작성하고 테스트를 작성하려고 했을 때 공식 문서에 명령 테스트 방법이 언급되어 있지 않은 것을 발견했습니다. 벽 너머로 정보를 찾는데 시간이 좀 걸렸고, 더 많은 분들의 편의를 위해 성공적으로 구현하고 녹음했습니다.

추천: "laravel 튜토리얼"

테스트 방법

모두가 Laravel이 Symfony의 성숙한 구성 요소를 많이 사용하고 Laravel의 콘솔 구성 요소가 Symfony/console을 사용한다는 것을 알고 있습니다.

다행히 Symfony/console 컴포넌트는 명령 테스트를 위해 CommandTester를 제공합니다. 사용 방법은 다음과 같습니다

...
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

이제 사용자를 수동으로 생성하는 데 사용되는 createUser 명령이 있습니다. .

사용자가 이름, 이메일, 비밀번호, 확인 비밀번호 및 기타 데이터를 입력할 수 있도록 대화형으로 허용해야 합니다.

테스트할 명령

<?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 = &#39;createUser&#39;;
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;create new user for system manually&#39;;
    /**
     * 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 = [
            &#39;name&#39; => $this->ask(&#39;What\&#39;s your name?&#39;),
            &#39;email&#39; => $this->ask(&#39;What\&#39;s your email?&#39;),
            &#39;password&#39; => $this->secret(&#39;What\&#39;s your password?&#39;),
            &#39;password_confirmation&#39; => $this->secret(&#39;Pleas confirm your password.&#39;)
        ];
        // 验证输入内容
        $validator = $this->makeValidator($data);
        if ($validator->fails()) {
            foreach ($validator->errors()->toArray() as $error) {
                foreach ($error as $message) {
                    $this->error($message);
                }
            }
            return;
        }
        // 向用户确认输入信息
        if (!$this->confirm(&#39;Confirm your info: &#39; . PHP_EOL . &#39;name:&#39; . $data[&#39;name&#39;] . PHP_EOL . &#39;email:&#39; . $data[&#39;email&#39;] . PHP_EOL . &#39;is this correct?&#39;)) {
            return;
        }
        // 注册
        $user = $this->create($data);
        event(new Registered($user));
        $this->line(&#39;User &#39; . $user->name . &#39; successfully registered&#39;);
    }
    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function makeValidator($data)
    {
        return Validator::make($data, [
            &#39;name&#39; => &#39;required|string|max:255|unique:users&#39;,
            &#39;email&#39; => &#39;required|string|email|max:255|unique:users&#39;,
            &#39;password&#39; => &#39;required|string|min:6|confirmed&#39;
        ]);
    }
    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array $data
     * @return \App\User
     */
    protected function create($data)
    {
        return User::create([
            &#39;name&#39; => $data[&#39;name&#39;],
            &#39;email&#39; => $data[&#39;email&#39;],
            &#39;password&#39; => bcrypt($data[&#39;password&#39;])
        ]);
    }
}

정확한 결과

정보를 올바르게 입력하면 다음과 같이 출력됩니다.

$ path-to-your-app/app# php artisan createUser
create new user for system manually
 What&#39;s your name?:
 > vestin
 What&#39;s your email?:
 > correct@abc.com
 What&#39;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

테스트하려는 내용

두 가지 콘텐츠를 테스트하고 싶습니다. :

1. 데이터 입력 확인 테스트

● 이메일 유효성 테스트

● 두 번 입력한 비밀번호가 동일한지 테스트

2. 사용자 테스트를 올바르게 생성하세요

● 단위 테스트 작성

<?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([&#39;Vestin&#39;, &#39;badEmail@abc&#39;, &#39;123456&#39;, &#39;654321&#39;]);
        $commandTester->execute([&#39;command&#39; => $testedCommand->getName()]);
        // assert
        $this->assertRegExp("/The email must be a valid email address/", $commandTester->getDisplay());
        $commandTester->setInputs([&#39;vestin&#39;, &#39;correct@abc.com&#39;, &#39;123456&#39;, &#39;654321&#39;]);
        $commandTester->execute([&#39;command&#39; => $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([&#39;Vestin&#39;, &#39;correct@abc.com&#39;, &#39;123456&#39;, &#39;123456&#39;, &#39;y&#39;]);
        $commandTester->execute([&#39;command&#39; => $testedCommand->getName()]);
        // assert
        $this->assertRegExp("/User Vestin successfully registered/", $commandTester->getDisplay());
        $this->assertDatabaseHas(&#39;users&#39;, [
            &#39;email&#39; => &#39;correct@abc.com&#39;,
            &#39;name&#39; => &#39;Vestin&#39;
        ]);
    }
}

테스트 실행

$ 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

위 내용은 laravel 명령을 테스트하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제