چطور مقدار رندوم رو تست کنیم؟

فرض کنید میخواهیم برای متدی تست بنویسیم که یک توکن از رشته ای ۶۰ کاراکتری را بصورت رندوم تولید میکند. عملکرد این تابع به این صورت خواهد بود:

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 دو کار انجام میدهد:

  1. رشته ای رندوم تولید میکند.
  2. اگر مقداری به عنوان ورودی داشت همان را برمیگرداند.

پکیج Carbon در php از این روش برای اینجکت کردن زمان مورد انتطار استفاده میکند:

$knownDate = Carbon::create(2001, 5, 21, 12);          
Carbon::setTestNow($knownDate);