درود دوستان
ممکنه براتون پیش اومده باشه که توی اجرای تستهاتون بخشی از کد تحت تست مقدار متغیری تولید میکرده و تست کردن رو براتون دشوار کرده. تو این بخش بهتون میگم اگر این مقدار متغیر تاریخ بود چطور میتونین مشکل رو حل کنین و امیدوارم به کارتون بیاد.
کلاس زیر رو در نظر بگیریم :
همونطور که میبینید متد generateName بعد از هر بار اجرا به دلیل استفاده از تابع date یک نام جدید و متفاوت تولید میکنه .
حالا فرض کنین ما بخوایم متد save رو تست کنیم که داخل خودش از متد generateName استفاده کرده:
خط ۳ یک آبجکت از کلاس FileManager میسازیم.
خط ۵ متد save را صدا کرده و یک فایل فرضی بهش پاس میدیم.
خط ۷ نامی که فکر میکنیم از متد generateName تولید شده.
خط ۹ انتظار داریم که یک فایل با نام 'testname' ذخیره شده باشد.
که میدونیم این تست پاس نمیشه . چون ما نمیدنیم چه نامی برای ذخیره در دیتابیس تولید شده.
برای حل این مشکل میتونیم از پکیج Carbon استفاده کنیم که احتمالا از قبل باهاش آشنا هستین و الان هم داخل پروژههاتون استفاده میشه. در خط ۱۶ به جای تابع date از کربن استفاده میکنیم:
تا اینجا نتیجه کارمون تغییری نکرده .ولی حالا میتونیم از متد setTestNow ابتدای تستمون استفاده کنیم و تاریخ و زمان مورد انتظار خودمون رو بهش پاس بدیم . کاری که این متد میکنه اینه که مقدار مد نظر ما رو میگیره و هر جای کدمون که از کربن استفاده شده باشه مقدار مد نظر مارو جایگزین میکنه . یعنی موقع اجرای تست میتونین نام فایل تولید شده رو خودمون تعیین کنیم:
و تمام. ما خروجی مد نظر خودمون از تاریخ رو تولید کردیم و اصطلاحا اون رو mock کردیم.