محراب محمدزاده
محراب محمدزاده
خواندن ۱ دقیقه·۲ سال پیش

چگونه تاریخ‌های متغیر در php و Laravel را تست کنیم

mock date in php
mock date in php

درود دوستان

ممکنه براتون پیش اومده باشه که توی اجرای تست‌هاتون بخشی از کد تحت تست مقدار متغیری تولید می‌کرده و تست کردن رو براتون دشوار کرده. تو این بخش بهتون میگم اگر این مقدار متغیر تاریخ بود چطور میتونین مشکل رو حل کنین و امیدوارم به کارتون بیاد.


کلاس زیر رو در نظر بگیریم :

تاریخ متغیر data()
تاریخ متغیر data()

همونطور که میبینید متد generateName بعد از هر بار اجرا به دلیل استفاده از تابع date یک نام جدید و متفاوت تولید میکنه .

حالا فرض کنین ما بخوایم متد save رو تست کنیم که داخل خودش از متد generateName استفاده کرده:

خط ۳ یک آبجکت از کلاس FileManager میسازیم.
خط ۵ متد save را صدا کرده و یک فایل فرضی بهش پاس میدیم.
خط ۷ نامی که فکر میکنیم از متد generateName تولید شده.
خط ۹ انتظار داریم که یک فایل با نام 'testname' ذخیره شده باشد.

که میدونیم این تست پاس نمیشه . چون ما نمیدنیم چه نامی برای ذخیره در دیتابیس تولید شده.

برای حل این مشکل میتونیم از پکیج Carbon استفاده کنیم که احتمالا از قبل باهاش آشنا هستین و الان هم داخل پروژه‌هاتون استفاده میشه. در خط ۱۶ به جای تابع date از کربن استفاده می‌کنیم:

تا اینجا نتیجه کارمون تغییری نکرده .ولی حالا میتونیم از متد setTestNow ابتدای تستمون استفاده کنیم و تاریخ و زمان مورد انتظار خودمون رو بهش پاس بدیم . کاری که این متد میکنه اینه که مقدار مد نظر ما رو میگیره و هر جای کدمون که از کربن استفاده شده باشه مقدار مد نظر مارو جایگزین میکنه . یعنی موقع اجرای تست میتونین نام فایل تولید شده رو خودمون تعیین کنیم:

و تمام. ما خروجی مد نظر خودمون از تاریخ رو تولید کردیم و اصطلاحا اون رو mock کردیم.


phplaravelتست نویسیunit test
دوستدار کد، دوستدار طبیعت، آروم
شاید از این پست‌ها خوشتان بیاید