نسخه:

تقلید

معرفی

هنگام آزمایش برنامه های لاراول، ممکن است بخواهید جنبه های خاصی از برنامه خود را "تقلید" کنید تا در طول یک آزمایش خاص اجرا نشوند. به عنوان مثال، هنگام آزمایش کنترلری که یک رویداد را ارسال می کند، ممکن است بخواهید شنوندگان رویداد را تقلید کنید تا در طول آزمایش واقعاً اجرا نشوند. این به شما امکان می دهد فقط پاسخ HTTP کنترلر را بدون نگرانی در مورد اجرای شنوندگان رویداد آزمایش کنید زیرا شنوندگان رویداد می توانند در مورد آزمایشی خودشان آزمایش شوند.

لاراول روش های مفیدی را برای تقلید وقایع، مشاغل و دیگر نماها از جعبه ارائه می دهد. این کمک‌ها در درجه اول یک لایه راحتی روی Mockery ارائه می‌کنند، بنابراین شما مجبور نیستید به صورت دستی فراخوانی‌های پیچیده روش Mockery را انجام دهید.

اشیاء تقلید

هنگام تقلید کردن یک شی که قرار است از طریق کانتینر سرویس لاراول به برنامه شما تزریق شود ، باید نمونه تقلید شده خود را به عنوان یک instance اتصال به کانتینر متصل کنید. این به کانتینر دستور می دهد که به جای ساختن خود شی، از نمونه تقلید شده شما از شی استفاده کند:

use App\Service;
use Mockery;
use Mockery\MockInterface;
 
public function test_something_can_be_mocked()
{
$this->instance(
Service::class,
Mockery::mock(Service::class, function (MockInterface $mock) {
$mock->shouldReceive('process')->once();
})
);
}

برای راحت‌تر کردن این کار، می‌توانید از mock روشی استفاده کنید که توسط کلاس تست پایه لاراول ارائه شده است. به عنوان مثال، مثال زیر معادل مثال بالا است:

use App\Service;
use Mockery\MockInterface;
 
$mock = $this->mock(Service::class, function (MockInterface $mock) {
$mock->shouldReceive('process')->once();
});

ممکن است زمانی از این روش استفاده کنید partialMock که فقط نیاز به تقلید چند روش از یک شی دارید. متدهایی که تقلید نمی شوند در صورت فراخوانی به طور معمول اجرا می شوند:

use App\Service;
use Mockery\MockInterface;
 
$mock = $this->partialMock(Service::class, function (MockInterface $mock) {
$mock->shouldReceive('process')->once();
});

به طور مشابه، اگر می‌خواهید روی یک شی جاسوسی کنید ، کلاس آزمایشی پایه لاراول spy روشی را به عنوان یک پوشش مناسب در اطراف Mockery::spy متد ارائه می‌کند. جاسوس ها شبیه به تقلید هستند. با این حال، جاسوس‌ها هرگونه تعامل بین جاسوس و کد مورد آزمایش را ضبط می‌کنند و به شما امکان می‌دهند پس از اجرای کد، اظهارنظر کنید:

use App\Service;
 
$spy = $this->spy(Service::class);
 
// ...
 
$spy->shouldHaveReceived('process');

نماهای تقلید

برخلاف فراخوانی‌های روش استاتیک سنتی، نماها (از جمله نماهای بلادرنگ ) ممکن است مورد تقلید قرار گیرند. این مزیت بزرگی را نسبت به روش‌های استاتیک سنتی ایجاد می‌کند و همان آزمایش‌پذیری را به شما می‌دهد که اگر از تزریق وابستگی سنتی استفاده می‌کردید، خواهید داشت. هنگام آزمایش، ممکن است اغلب بخواهید تماسی به نمای لاراول که در یکی از کنترلرهای شما رخ می دهد را تقلید کنید. به عنوان مثال، عمل کنترلر زیر را در نظر بگیرید:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Support\Facades\Cache;
 
class UserController extends Controller
{
/**
* Retrieve a list of all users of the application.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$value = Cache::get('key');
 
//
}
}

Cache ما می‌توانیم با استفاده از shouldReceive روشی که نمونه‌ای از ماک تقلید را برمی‌گرداند ، تماس را به نما تقلید کنیم . از آنجایی که نماها در واقع توسط کانتینر سرویس لاراول حل و فصل می شوند ، آزمایش پذیری بسیار بیشتری نسبت به یک کلاس استاتیک معمولی دارند. به عنوان مثال، بیایید فراخوانی خود را به روش Cache نما تقلید کنیم get :

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Cache;
use Tests\TestCase;
 
class UserControllerTest extends TestCase
{
public function testGetIndex()
{
Cache::shouldReceive('get')
->once()
->with('key')
->andReturn('value');
 
$response = $this->get('/users');
 
// ...
}
}

شما نباید Request نما را تقلید کنید. در عوض، ورودی مورد نظر خود را به روش‌های تست HTTP مانند get و post هنگام اجرای آزمایش ارسال کنید. به همین ترتیب، به جای تقلید Config نما، Config::set روش را در تست های خود فراخوانی کنید.

جاسوس های نما

اگر می خواهید روی یک نما جاسوسی کنید ، می توانید spy روش را در نمای مربوطه فراخوانی کنید. جاسوس ها شبیه به تقلید هستند. با این حال، جاسوس‌ها هرگونه تعامل بین جاسوس و کد مورد آزمایش را ضبط می‌کنند و به شما امکان می‌دهند پس از اجرای کد، اظهارنظر کنید:

use Illuminate\Support\Facades\Cache;
 
public function test_values_are_be_stored_in_cache()
{
Cache::spy();
 
$response = $this->get('/');
 
$response->assertStatus(200);
 
Cache::shouldHaveReceived('put')->once()->with('name', 'Taylor', 10);
}

مسیر تقلبی

هنگام آزمایش کدی که کارها را ارسال می کند، معمولاً می خواهید ادعا کنید که یک کار مشخص ارسال شده است اما در واقع کار را در صف قرار نمی دهید یا اجرا نمی کنید. این به این دلیل است که اجرای کار معمولاً می تواند در یک کلاس آزمایشی جداگانه آزمایش شود.

می توانید از روش Bus نما fake برای جلوگیری از ارسال کارها به صف استفاده کنید. سپس، پس از اجرای کد مورد آزمایش، می‌توانید با استفاده از روش‌های assertDispatched و روش‌های زیر را بررسی کنید که برنامه کدام کارها را ارسال کرده است assertNotDispatched :

<?php
 
namespace Tests\Feature;
 
use App\Jobs\ShipOrder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Bus;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped()
{
Bus::fake();
 
// Perform order shipping...
 
// Assert that a job was dispatched...
Bus::assertDispatched(ShipOrder::class);
 
// Assert a job was not dispatched...
Bus::assertNotDispatched(AnotherJob::class);
 
// Assert that a job was dispatched synchronously...
Bus::assertDispatchedSync(AnotherJob::class);
 
// Assert that a job was not dispatched synchronously...
Bus::assertNotDispatchedSync(AnotherJob::class);
 
// Assert that a job was dispatched after the response was sent...
Bus::assertDispatchedAfterResponse(AnotherJob::class);
 
// Assert a job was not dispatched after response was sent...
Bus::assertNotDispatchedAfterResponse(AnotherJob::class);
 
// Assert no jobs were dispatched...
Bus::assertNothingDispatched();
}
}

می‌توانید روش‌های موجود را به‌منظور تأیید اینکه شغلی ارسال شده است که در یک «تست حقیقت» معین گذرانده شده است، گذرانده‌اید. اگر حداقل یک شغل ارسال شده باشد که آزمون صدق داده شده را با موفقیت پشت سر بگذارد، این ادعا موفقیت آمیز خواهد بود. به عنوان مثال، ممکن است بخواهید ادعا کنید که یک کار برای یک سفارش خاص ارسال شده است:

Bus::assertDispatched(function (ShipOrder $job) use ($order) {
return $job->order->id === $order->id;
});

جعل زیر مجموعه ای از مشاغل

اگر فقط می‌خواهید از ارسال مشاغل خاصی جلوگیری کنید، می‌توانید کارهایی را که باید جعلی باشند به fake روش زیر منتقل کنید:

/**
* Test order process.
*/
public function test_orders_can_be_shipped()
{
Bus::fake([
ShipOrder::class,
]);
 
// ...
}

با استفاده از روش زیر می توانید همه کارها را جعل کنید به جز مجموعه ای از مشاغل مشخص شده except :

Bus::fake()->except([
ShipOrder::class,
]);

زنجیره های شغلی

روش Bus نما assertChained ممکن است برای اثبات اینکه زنجیره ای از کارها ارسال شده است استفاده شود. این assertChained روش آرایه ای از کارهای زنجیره ای را به عنوان اولین آرگومان خود می پذیرد:

use App\Jobs\RecordShipment;
use App\Jobs\ShipOrder;
use App\Jobs\UpdateInventory;
use Illuminate\Support\Facades\Bus;
 
Bus::assertChained([
ShipOrder::class,
RecordShipment::class,
UpdateInventory::class
]);

همانطور که در مثال بالا می بینید، آرایه مشاغل زنجیره ای ممکن است آرایه ای از نام کلاس های شغل باشد. با این حال، ممکن است مجموعه‌ای از نمونه‌های شغلی واقعی را نیز ارائه کنید. هنگام انجام این کار، لاراول اطمینان حاصل می کند که نمونه های کار از یک کلاس هستند و دارای ارزش های یکسانی از مشاغل زنجیره ای ارسال شده توسط برنامه شما هستند:

Bus::assertChained([
new ShipOrder,
new RecordShipment,
new UpdateInventory,
]);

دسته های شغلی

روش Bus نما assertBatched ممکن است برای ادعای ارسال دسته ای از کارها استفاده شود. بسته شدن داده شده به assertBatched روش نمونه ای از را دریافت می کند Illuminate\Bus\PendingBatch که ممکن است برای بازرسی کارهای درون دسته استفاده شود:

use Illuminate\Bus\PendingBatch;
use Illuminate\Support\Facades\Bus;
 
Bus::assertBatched(function (PendingBatch $batch) {
return $batch->name == 'import-csv' &&
$batch->jobs->count() === 10;
});

کار تست / تعامل دسته ای

علاوه بر این، ممکن است گاهی لازم باشد تعامل یک شغل فردی را با دسته اصلی آن آزمایش کنید. برای مثال، ممکن است لازم باشد آزمایش کنید که آیا یک کار پردازش بیشتر برای دسته خود را لغو کرده است یا خیر. برای انجام این کار، باید یک دسته جعلی را از طریق withFakeBatch روش به کار اختصاص دهید. این withFakeBatch روش یک تاپل حاوی نمونه کار و دسته جعلی را برمی گرداند:

[$job, $batch] = (new ShipOrder)->withFakeBatch();
 
$job->handle();
 
$this->assertTrue($batch->cancelled());
$this->assertEmpty($batch->added);

رویداد جعلی

هنگام آزمایش کدی که رویدادها را ارسال می کند، ممکن است بخواهید به لاراول دستور دهید که واقعا شنوندگان رویداد را اجرا نکند. با استفاده از روش Event نما fake ، می‌توانید از اجرای شنوندگان جلوگیری کنید، کد مورد آزمایش را اجرا کنید و سپس با استفاده از روش‌های، و و مشخص کنید که کدام رویدادها توسط برنامه شما ارسال assertDispatched شده assertNotDispatched است assertNothingDispatched :

<?php
 
namespace Tests\Feature;
 
use App\Events\OrderFailedToShip;
use App\Events\OrderShipped;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Event;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* Test order shipping.
*/
public function test_orders_can_be_shipped()
{
Event::fake();
 
// Perform order shipping...
 
// Assert that an event was dispatched...
Event::assertDispatched(OrderShipped::class);
 
// Assert an event was dispatched twice...
Event::assertDispatched(OrderShipped::class, 2);
 
// Assert an event was not dispatched...
Event::assertNotDispatched(OrderFailedToShip::class);
 
// Assert that no events were dispatched...
Event::assertNothingDispatched();
}
}

assertDispatched شما می‌توانید روش‌های یا روش‌های بسته را بگذرانید assertNotDispatched تا ادعا کنید رویدادی ارسال شده است که یک "آزمون حقیقت" معین را گذرانده است. اگر حداقل یک رویداد ارسال شده باشد که آزمون صدق داده شده را با موفقیت پشت سر بگذارد، ادعا موفقیت آمیز خواهد بود:

Event::assertDispatched(function (OrderShipped $event) use ($order) {
return $event->order->id === $order->id;
});

اگر به سادگی می خواهید ادعا کنید که شنونده رویداد در حال گوش دادن به یک رویداد خاص است، می توانید از assertListening روش زیر استفاده کنید:

Event::assertListening(
OrderShipped::class,
SendShipmentNotification::class
);

پس از تماس Event::fake() ، هیچ شنونده رویدادی اجرا نمی شود. بنابراین، اگر آزمایش‌های شما از کارخانه‌های مدل استفاده می‌کنند که به رویدادها متکی هستند، مانند ایجاد UUID در طول creating رویداد یک مدل، باید Event::fake() پس از استفاده از کارخانه‌های خود تماس بگیرید.

جعل کردن زیر مجموعه ای از رویدادها

اگر فقط می خواهید شنوندگان رویداد را برای مجموعه خاصی از رویدادها جعل کنید، می توانید آنها را به روش fake یا ارسال کنید fakeFor :

/**
* Test order process.
*/
public function test_orders_can_be_processed()
{
Event::fake([
OrderCreated::class,
]);
 
$order = Order::factory()->create();
 
Event::assertDispatched(OrderCreated::class);
 
// Other events are dispatched as normal...
$order->update([...]);
}

شما می توانید همه رویدادها را جعل کنید به جز مجموعه ای از رویدادهای مشخص شده با استفاده از except روش:

Event::fake()->except([
OrderCreated::class,
]);

تقلبی رویدادهای محدوده

اگر فقط می خواهید شنوندگان رویداد را برای بخشی از آزمایش خود جعل کنید، می توانید از fakeFor روش زیر استفاده کنید:

<?php
 
namespace Tests\Feature;
 
use App\Events\OrderCreated;
use App\Models\Order;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* Test order process.
*/
public function test_orders_can_be_processed()
{
$order = Event::fakeFor(function () {
$order = Order::factory()->create();
 
Event::assertDispatched(OrderCreated::class);
 
return $order;
});
 
// Events are dispatched as normal and observers will run ...
$order->update([...]);
}
}

HTTP جعلی

روش Http نما fake به شما این امکان را می‌دهد که به مشتری HTTP دستور دهید در هنگام درخواست، پاسخ‌های stubbed/dummy را بازگرداند. برای اطلاعات بیشتر در مورد جعلی درخواست‌های HTTP خروجی، لطفاً به مستندات آزمایشی HTTP Client مراجعه کنید .

ایمیل جعلی

می توانید از روش Mail نما fake برای جلوگیری از ارسال نامه استفاده کنید. به طور معمول، ارسال نامه به کدی که واقعاً آزمایش می کنید، ارتباطی ندارد. به احتمال زیاد، کافی است به سادگی ادعا کنیم که لاراول به ارسال یک پست الکترونیکی معین دستور داده شده است.

پس از فراخوانی روش Mail نما fake ، می‌توانید ادعا کنید که فایل‌های پستی برای ارسال به کاربران دستور داده شده‌اند و حتی داده‌های دریافت‌شده را بررسی کنید:

<?php
 
namespace Tests\Feature;
 
use App\Mail\OrderShipped;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Mail;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped()
{
Mail::fake();
 
// Perform order shipping...
 
// Assert that no mailables were sent...
Mail::assertNothingSent();
 
// Assert that a mailable was sent...
Mail::assertSent(OrderShipped::class);
 
// Assert a mailable was sent twice...
Mail::assertSent(OrderShipped::class, 2);
 
// Assert a mailable was not sent...
Mail::assertNotSent(AnotherMailable::class);
}
}

اگر پست‌های پستی را برای تحویل در پس‌زمینه در صف قرار می‌دهید، باید از assertQueued روش به جای استفاده از assertSent :

Mail::assertQueued(OrderShipped::class);
 
Mail::assertNotQueued(OrderShipped::class);
 
Mail::assertNothingQueued();

می‌توانید روش‌های assertSent , assertNotSent , assertQueued , یا بسته شدن را بگذرانید assertNotQueued تا ادعا کنید که یک پستی ارسال شده است که یک "تست حقیقت" معین را گذرانده است. اگر حداقل یک پستی ارسال شده باشد که آزمون صدق داده شده را با موفقیت پشت سر بگذارد، ادعا موفقیت آمیز خواهد بود:

Mail::assertSent(function (OrderShipped $mail) use ($order) {
return $mail->order->id === $order->id;
});

هنگام فراخوانی Mail روش‌های ادعای نما، نمونه پستی پذیرفته شده توسط بسته ارائه شده، روش‌های مفیدی را برای بررسی قابل ارسال نشان می‌دهد:

Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
return $mail->hasTo($user->email) &&
$mail->hasCc('...') &&
$mail->hasBcc('...') &&
$mail->hasReplyTo('...') &&
$mail->hasFrom('...') &&
$mail->hasSubject('...');
});

نمونه mailable همچنین شامل چندین روش مفید برای بررسی پیوست‌های موجود در یک mailable است:

use Illuminate\Mail\Mailables\Attachment;
 
Mail::assertSent(OrderShipped::class, function ($mail) {
return $mail->hasAttachment(
Attachment::fromPath('/path/to/file')
->as('name.pdf')
->withMime('application/pdf')
);
});
 
Mail::assertSent(OrderShipped::class, function ($mail) {
return $mail->hasAttachment(
Attachment::fromStorageDisk('s3', '/path/to/file')
);
});
 
Mail::assertSent(OrderShipped::class, function ($mail) use ($pdfData) {
return $mail->hasAttachment(
Attachment::fromData(fn () => $pdfData, 'name.pdf')
);
});

ممکن است متوجه شده باشید که دو روش برای اثبات عدم ارسال نامه وجود دارد: assertNotSent و assertNotQueued . گاهی اوقات ممکن است بخواهید ادعا کنید که هیچ نامه ای ارسال نشده یا در صف قرار نگرفته است. برای انجام این کار، می توانید از assertNothingOutgoing و assertNotOutgoing روش های زیر استفاده کنید:

Mail::assertNothingOutgoing();
 
Mail::assertNotOutgoing(function (OrderShipped $mail) use ($order) {
return $mail->order->id === $order->id;
});

آزمایش محتوای پستی

پیشنهاد می‌کنیم محتوای فایل‌های پستی خود را جدا از آزمایش‌هایی که ادعا می‌کنند یک پستی داده شده برای یک کاربر خاص "ارسال شده است" را آزمایش کنید. برای یادگیری نحوه آزمایش محتوای mailables خود، مستندات ما را در مورد آزمایشی mailables بررسی کنید .

اعلان جعلی

می توانید از روش Notification نما fake برای جلوگیری از ارسال اعلان ها استفاده کنید. به طور معمول، ارسال اعلان‌ها با کدی که واقعاً آزمایش می‌کنید ارتباطی ندارد. به احتمال زیاد، کافی است به سادگی ادعا کنیم که لاراول به ارسال یک اعلان داده شده دستور داده شده است.

پس از فراخوانی روش Notification نما fake ، می‌توانید ادعا کنید که اعلان‌ها برای ارسال به کاربران دستور داده شده است و حتی داده‌های دریافتی اعلان‌ها را بررسی کنید:

<?php
 
namespace Tests\Feature;
 
use App\Notifications\OrderShipped;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped()
{
Notification::fake();
 
// Perform order shipping...
 
// Assert that no notifications were sent...
Notification::assertNothingSent();
 
// Assert a notification was sent to the given users...
Notification::assertSentTo(
[$user], OrderShipped::class
);
 
// Assert a notification was not sent...
Notification::assertNotSentTo(
[$user], AnotherNotification::class
);
 
// Assert that a given number of notifications were sent...
Notification::assertCount(3);
}
}

assertSentTo شما می‌توانید روش‌های یا روش‌های بسته را بپذیرید assertNotSentTo تا ادعا کنید اعلانی ارسال شده است که در یک "تست حقیقت" معین گذرانده شده است. اگر حداقل یک اعلان ارسال شده باشد که آزمون صدق داده شده را با موفقیت پشت سر بگذارد، ادعا موفقیت آمیز خواهد بود:

Notification::assertSentTo(
$user,
function (OrderShipped $notification, $channels) use ($order) {
return $notification->order->id === $order->id;
}
);

اعلان های درخواستی

اگر کدی که آزمایش می‌کنید اعلان‌های درخواستی ارسال می‌کند ، می‌توانید آزمایش کنید که اعلان درخواستی از طریق assertSentOnDemand روش زیر ارسال شده است:

Notification::assertSentOnDemand(OrderShipped::class);

با ارسال یک بسته به عنوان آرگومان دوم برای assertSentOnDemand متد، می توانید تعیین کنید که آیا یک اعلان درخواستی به آدرس صحیح "مسیر" ارسال شده است یا خیر:

Notification::assertSentOnDemand(
OrderShipped::class,
function ($notification, $channels, $notifiable) use ($user) {
return $notifiable->routes['mail'] === $user->email;
}
);

صف جعلی

شما می توانید از روش Queue نما fake برای جلوگیری از فشار دادن مشاغل در صف به صف استفاده کنید. به احتمال زیاد، کافی است به سادگی ادعا کنیم که به لاراول دستور داده شده است تا یک کار معین را به صف فشار دهد، زیرا خود کارهای صف ممکن است در کلاس آزمایشی دیگری آزمایش شوند.

پس از فراخوانی متد Queue نما fake ، می‌توانید ادعا کنید که برنامه تلاش کرده است تا کارها را به صف بکشد:

<?php
 
namespace Tests\Feature;
 
use App\Jobs\AnotherJob;
use App\Jobs\FinalJob;
use App\Jobs\ShipOrder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Queue;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped()
{
Queue::fake();
 
// Perform order shipping...
 
// Assert that no jobs were pushed...
Queue::assertNothingPushed();
 
// Assert a job was pushed to a given queue...
Queue::assertPushedOn('queue-name', ShipOrder::class);
 
// Assert a job was pushed twice...
Queue::assertPushed(ShipOrder::class, 2);
 
// Assert a job was not pushed...
Queue::assertNotPushed(AnotherJob::class);
}
}

assertPushed شما می‌توانید روش‌های یا روش‌های بسته را بپذیرید assertNotPushed تا ادعا کنید شغلی تحت فشار قرار گرفته است که یک «آزمون حقیقت» معین را گذرانده است. اگر حداقل یک شغل تحت فشار قرار گرفته باشد که آزمون صدق داده شده را با موفقیت پشت سر بگذارد، این ادعا موفقیت آمیز خواهد بود:

Queue::assertPushed(function (ShipOrder $job) use ($order) {
return $job->order->id === $order->id;
});

اگر فقط باید کارهای خاصی را جعل کنید در حالی که به کارهای دیگر خود اجازه می دهید به طور عادی اجرا شوند، می توانید نام کلاس های مشاغلی را که باید جعل شوند به روش ارسال کنید fake :

public function test_orders_can_be_shipped()
{
Queue::fake([
ShipOrder::class,
]);
 
// Perform order shipping...
 
// Assert a job was pushed twice...
Queue::assertPushed(ShipOrder::class, 2);
}

زنجیره های شغلی

نما و روش ها ممکن Queue است برای بازرسی زنجیره کار یک کار هل داده شده استفاده شود. این روش کار اولیه را به عنوان اولین آرگومان خود و آرایه ای از کارهای زنجیره ای را به عنوان آرگومان دوم خود می پذیرد: assertPushedWithChain assertPushedWithoutChain assertPushedWithChain

use App\Jobs\RecordShipment;
use App\Jobs\ShipOrder;
use App\Jobs\UpdateInventory;
use Illuminate\Support\Facades\Queue;
 
Queue::assertPushedWithChain(ShipOrder::class, [
RecordShipment::class,
UpdateInventory::class
]);

همانطور که در مثال بالا می بینید، آرایه مشاغل زنجیره ای ممکن است آرایه ای از نام کلاس های شغل باشد. با این حال، ممکن است مجموعه‌ای از نمونه‌های شغلی واقعی را نیز ارائه کنید. هنگام انجام این کار، لاراول اطمینان حاصل می کند که نمونه های کار از یک کلاس هستند و دارای ارزش های یکسانی از مشاغل زنجیره ای ارسال شده توسط برنامه شما هستند:

Queue::assertPushedWithChain(ShipOrder::class, [
new RecordShipment,
new UpdateInventory,
]);

می‌توانید از این assertPushedWithoutChain روش برای تأیید اینکه یک کار بدون زنجیره‌ای از مشاغل تحت فشار قرار گرفته است استفاده کنید:

Queue::assertPushedWithoutChain(ShipOrder::class);

ذخیره سازی تقلبی

روش Storage نما fake به شما این امکان را می دهد که به راحتی یک دیسک جعلی تولید کنید که در ترکیب با ابزارهای تولید فایل کلاس Illuminate\Http\UploadedFile ، آزمایش آپلود فایل را تا حد زیادی ساده می کند. مثلا:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_albums_can_be_uploaded()
{
Storage::fake('photos');
 
$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
]);
 
// Assert one or more files were stored...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
 
// Assert one or more files were not stored...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
 
// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
}
}

به طور پیش فرض، این fake روش تمام فایل های موجود در فهرست موقت خود را حذف می کند. اگر می خواهید این فایل ها را نگه دارید، می توانید به جای آن از روش "persistentFake" استفاده کنید. برای اطلاعات بیشتر در مورد آزمایش آپلود فایل، می توانید به اطلاعات مستندات آزمایش HTTP در مورد آپلود فایل مراجعه کنید .

این image روش به پسوند GD نیاز دارد .

تعامل با زمان

هنگام آزمایش، ممکن است گهگاه نیاز به تغییر زمان برگشتی توسط کمک‌کنندگانی مانند now یا داشته باشید Illuminate\Support\Carbon::now() . خوشبختانه، کلاس تست ویژگی پایه لاراول شامل کمک هایی است که به شما امکان می دهد زمان فعلی را دستکاری کنید:

use Illuminate\Support\Carbon;
 
public function testTimeCanBeManipulated()
{
// Travel into the future...
$this->travel(5)->milliseconds();
$this->travel(5)->seconds();
$this->travel(5)->minutes();
$this->travel(5)->hours();
$this->travel(5)->days();
$this->travel(5)->weeks();
$this->travel(5)->years();
 
// Freeze time and resume normal time after executing closure...
$this->freezeTime(function (Carbon $time) {
// ...
});
 
// Travel into the past...
$this->travel(-5)->hours();
 
// Travel to an explicit time...
$this->travelTo(now()->subHours(6));
 
// Return back to the present time...
$this->travelBack();
}