تقلید
- معرفی
- اشیاء تقلید
- نماهای تقلید
- مسیر تقلبی
- رویداد جعلی
- HTTP جعلی
- ایمیل جعلی
- اعلان جعلی
- صف جعلی
- ذخیره سازی تقلبی
- تعامل با زمان
معرفی
هنگام آزمایش برنامه های لاراول، ممکن است بخواهید جنبه های خاصی از برنامه خود را "تقلید" کنید تا در طول یک آزمایش خاص اجرا نشوند. به عنوان مثال، هنگام آزمایش کنترلری که یک رویداد را ارسال می کند، ممکن است بخواهید شنوندگان رویداد را تقلید کنید تا در طول آزمایش واقعاً اجرا نشوند. این به شما امکان می دهد فقط پاسخ 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();}