Переопределение основной функции rand () в PHPUnit работает только при запуске в отдельном процессе - PullRequest
0 голосов
/ 19 июня 2019

Я хочу использовать PHPUnit для проверки некоторых крайних случаев в функции, которая вызывает rand ().В моем файле composer.json есть строки:

"autoload": {
    "psr-4": {"CashID\\": "src/"}
},
"autoload-dev": {
    "psr-4": {
      "CashID\\Tests\\": "tests/",
      "CashID\\": "tests/Overriders/"
    }
}

Я создал статический класс RandOverrider.php:

<?php
namespace CashID;
/**
 * Overriding the PHP core random number generator
 *
 * There are times when we would like to specify the result of rand() to test edge cases
 */
function rand(...$params)
{
    return RandOverrider::getRand(...$params);
}
class RandOverrider
{
    protected static $override_rand = false;
    protected static $random_values = [];
    public static function setRand(array $rand)
    {
        self::$random_values = $rand;
    }
    public static function getRand(...$params)
    {
        if (self::$override_rand) {
            return array_shift(self::$random_values);
        } else {
            return \rand(...$params);
        }
    }
    public static function setOverride()
    {
        self::$override_rand = true;
    }
    public static function unsetOverride()
    {
        self::$override_rand = false;
    }
}

Начиная с класса, который я тестирую в пространстве имен CashID,Я предполагал, что любые вызовы rand (), которые он делает, всегда будут вызывать функцию, определенную в этом классе.Однако, если я не добавлю тег @runInSeparateProcess в свой тест, будет выполнена основная функция rand (), несмотря на то, что тест успешно взаимодействовал с классом RandOverrider.Вот тест:

/**
 * @testCase testRerunDuplicateNonce
 * @runInSeparateProcess
 */
public function testRerunDuplicateNonce()
{
    \CashID\RandOverrider::setOverride();
    \CashID\RandOverrider::setRand([100000000, 100000000, 100000001]);
    $request1 = $this->generator->createRequest();
    $request2 = $this->generator->createRequest();
    \CashID\RandOverrider::unsetOverride();
    $nonce1 = substr($request1, -9);
    $nonce2 = substr($request2, -9);

    $this->assertEquals(100000000, $nonce1);
    $this->assertEquals(100000001, $nonce2);
}

Функция createRequest () - это то, что делает вызов rand ().Кто-нибудь может объяснить, зачем нужен runInSeparateProcess?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...