فرض کنید میخواهیم برای متدی تست بنویسیم که یک توکن از رشته ای ۶۰ کاراکتری را بصورت رندوم تولید میکند. عملکرد این تابع به این صورت خواهد بود:
function random_string($length) { $key = ''; $keys = array_merge(range(0, 9), range('a', 'z')); for ($i = 0; $i < $length; $i++) { $key .= $keys[array_rand($keys)]; } return $key; }
حالا میخواهیم تستی بنویسیم که بعد از ساختن کاربر، مقدار توکن را تست کنیم تا مطمئن شویم از این متد استفاده میکند:
$this->assertEquals('c6iZq87cWhZzV0AJK0XlVqYxCIPFkBoh', $user->token);
برای این کار متدی استاتیک از کلاس توکن میسازیم:
<?php class Token { public static function random_string($length) { $key = ' '; $keys = array_merge(range(0, 9), range('a', 'z')); for ($i = 0; $i < $length; $i++) { $key .= $keys[array_rand($keys)]; } return $key; } }
حالا باید متدی داشته باشیم تا بتوانیم در محیط تست رشته ای رندوم را شبیه سازی و به آن اینجکت کنیم. یعنی درتست به این متد بگوییم هرگاه صدا زده شدی مقدار مشخصی را برگردان تا بتوانیم همان را انتظار داشته باشیم:
Token::setTest('c6iZq87cWhZzV0AJK0XlVqYxCIPFkBoh') $user = User::create(); $this->assertEquals('c6iZq87cWhZzV0AJK0XlVqYxCIPFkBoh', $user->token);
خب حالا کافیه کلاس Token را به اینصورت تکمیل کنیم:
<?php class Token { static $testToken =null; public static function generate(){ return static::$testToken ?:static::random_string(32); } public static function setTest($string){ static::$testToken = $string; } public static function random_string($length) { $key = ''; $keys = array_merge(range(0, 9), range('a', 'z')); for ($i = 0; $i < $length; $i++) { $key .= $keys[array_rand($keys)]; } return $key; } }
متد generate دو کار انجام میدهد:
پکیج Carbon در php از این روش برای اینجکت کردن زمان مورد انتطار استفاده میکند:
$knownDate = Carbon::create(2001, 5, 21, 12); Carbon::setTestNow($knownDate);