Я хочу использовать 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?