تست های کنسول
معرفی
لاراول علاوه بر سادهسازی تست HTTP، یک API ساده برای آزمایش دستورات کنسول سفارشی برنامه شما ارائه میکند .
موفقیت / انتظارات شکست
برای شروع، بیایید نحوه اظهار نظر در مورد کد خروج یک فرمان Artisan را بررسی کنیم. برای انجام این کار،
artisan
از روش فراخوانی دستور Artisan از تست خود
استفاده می کنیم .
سپس، از روش استفاده خواهیم کرد
assertExitCode
تا ادعا کنیم که دستور با یک کد خروج داده شده تکمیل شده است:
test('console command', function () { $this->artisan('inspire')->assertExitCode(0);});
/** * Test a console command. */public function test_console_command(): void{ $this->artisan('inspire')->assertExitCode(0);}
میتوانید از این
assertNotExitCode
روش برای تأیید اینکه دستور با کد خروجی داده شده خارج نشده است استفاده کنید:
$this->artisan('inspire')->assertNotExitCode(1);
البته، تمام دستورات ترمینال معمولاً با کد وضعیت
0
زمانی که موفقیت آمیز هستند و کد خروج غیر صفر زمانی که موفقیت آمیز نیستند، خارج می شوند. بنابراین، برای راحتی، میتوانید از اعترافات
assertSuccessful
و
assertFailed
برای تأیید اینکه یک دستور داده شده با یک کد خروج موفق خارج شده است یا خیر، استفاده کنید:
$this->artisan('inspire')->assertSuccessful(); $this->artisan('inspire')->assertFailed();
انتظارات ورودی / خروجی
لاراول به شما اجازه می دهد تا با استفاده از این روش، به راحتی ورودی کاربر را برای دستورات کنسول خود "تقلید کنید"
expectsQuestion
. علاوه بر این، می توانید کد خروجی و متنی را که انتظار دارید توسط دستور کنسول با استفاده از متدهای
assertExitCode
و خروجی داده شود را مشخص کنید
expectsOutput
. به عنوان مثال، دستور کنسول زیر را در نظر بگیرید:
Artisan::command('question', function () { $name = $this->ask('What is your name?'); $language = $this->choice('Which language do you prefer?', [ 'PHP', 'Ruby', 'Python', ]); $this->line('Your name is '.$name.' and you prefer '.$language.'.');});
می توانید این دستور را با تست زیر که از متدهای
expectsQuestion
,
expectsOutput
,
doesntExpectOutput
,
expectsOutputToContain
,
doesntExpectOutputToContain
, و استفاده می کند تست کنید
assertExitCode
:
test('console command', function () { $this->artisan('question') ->expectsQuestion('What is your name?', 'Taylor Otwell') ->expectsQuestion('Which language do you prefer?', 'PHP') ->expectsOutput('Your name is Taylor Otwell and you prefer PHP.') ->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.') ->expectsOutputToContain('Taylor Otwell') ->doesntExpectOutputToContain('you prefer Ruby') ->assertExitCode(0);});
/** * Test a console command. */public function test_console_command(): void{ $this->artisan('question') ->expectsQuestion('What is your name?', 'Taylor Otwell') ->expectsQuestion('Which language do you prefer?', 'PHP') ->expectsOutput('Your name is Taylor Otwell and you prefer PHP.') ->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.') ->expectsOutputToContain('Taylor Otwell') ->doesntExpectOutputToContain('you prefer Ruby') ->assertExitCode(0);}
انتظارات تایید
هنگام نوشتن دستوری که انتظار تایید در قالب پاسخ "بله" یا "خیر" را دارد، می توانید از
expectsConfirmation
روش زیر استفاده کنید:
$this->artisan('module:import') ->expectsConfirmation('Do you really wish to run this command?', 'no') ->assertExitCode(1);
جدول انتظارات
اگر دستور شما جدولی از اطلاعات را با استفاده از
table
روش Artisan نمایش می دهد، نوشتن انتظارات خروجی برای کل جدول می تواند دشوار باشد. در عوض، می توانید از
expectsTable
روش استفاده کنید. این متد هدر جدول را به عنوان آرگومان اول و داده های جدول را به عنوان آرگومان دوم می پذیرد:
$this->artisan('users:all') ->expectsTable([ 'ID', 'Email', ], [ [1, 'taylor@example.com'], [2, 'abigail@example.com'], ]);
رویدادهای کنسول
بهطور پیشفرض، رویدادها
Illuminate\Console\Events\CommandStarting
و
Illuminate\Console\Events\CommandFinished
هنگام اجرای آزمایشهای برنامه شما ارسال نمیشوند. با این حال، میتوانید این رویدادها را برای یک کلاس آزمایشی مشخص با افزودن صفت
Illuminate\Foundation\Testing\WithConsoleEvents
به کلاس فعال کنید:
<?php use Illuminate\Foundation\Testing\WithConsoleEvents; uses(WithConsoleEvents::class); // ...
<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\WithConsoleEvents;use Tests\TestCase; class ConsoleEventTest extends TestCase{ use WithConsoleEvents; // ...}