Как написать тест на чертуPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как написать тест на черту

Сообщение Anonymous »

У меня есть черта с именем hasdefault
ее основная цель - убедиться, что в классе есть статическое поле $ default , который можно вызывать и возвращает экземпляр по умолчанию Класс Использование признака < /p>
Это то, как выглядит код признака: < /p>

Код: Выделить всё

private static $default;

public static function setDefault(callable $fn): void
{
self::checkWhetherCallableReturnsClass($fn);
self::$default = $fn;
}

public static function getDefault(): static
{
if (!isset(static::$default)) {
static::initDefault();
}
return call_user_func(static::$default);
}

protected static function initDefault(): void
{
static::$default = function (): static {
return new static();
};
}
Что важно, так это то, что вызов признака $ default должен вернуть объект класса, который использует признак.
Например , если класс mysuperclass использует эту черту, объект, возвращаемый для него, должен быть объектом класса MySuperClass или классов, которые наследуют от него.
В основном, Проверка, если этот тип верен в тег getDefault () return, но поскольку функция, возвращающая экземпляр по умолчанию , а не при вызове метода getDefault . Private, и его основная задача - проверить, основываясь на отражении, если возвратный тег верен, и бросить исключение, если это не так.
Как правило, метод принимает:

Имя класса. < /li> или self только в случае, когда Static / относится к таковому классу, который использует черту. static & exationInterface (с предостережением, как указано выше) Проверьте это. В большинстве из этих подобных сценариев я использую анонимные классы, и это выглядело так: < /p>

Код: Выделить всё

private function getObjectThatIsCorrect(): object
{
return new class(0) {
use HasDefault;

protected static function initDefault(): void
{
static::$default = function (): self {
return new self(5);
};
}

public function __construct(public int $fakeIdToRecognizeObjects)
{
}

public function returnThisByStatic(): static
{
return $this;
}

public function returnThisBySelf(): self
{
return $this;
}

public static function returnsNewByStatic(): static
{
return new static(1);
}

public static function returnsNewBySelf(): self
{
return new self(2);
}
};
}
< /code>
и используйте этот анонимный несколько раз, чтобы проверить так: < /p>
$object = $this->getObjectThatIsCorrect();
$object::setDefault([$object, 'returnThisByStatic']);

$this->assertEquals($object, $object::getDefault());

$object = $this->getObjectThatIsCorrect();
$object::setDefault([$object, 'returnThisBySelf']);
$this->assertEquals($object, $object::getDefault());

$object = $this->getObjectThatIsCorrect();
$object::setDefault([$object, 'returnsNewByStatic']);
$this->assertEquals(1, $object::getDefault()->id);

$object = $this->getObjectThatIsCorrect();
$object::setDefault([$object, 'returnsNewBySelf']);
$this->assertEquals(2, $object::getDefault()->id);
< /code>
И в этом случае все будет работать отлично, проблема возникает, когда я хочу проверить анонимную функцию: < /p>
public function testSetDefault()
{
$object = $this->getObjectThatIsCorrect();
$object::setDefault(function () use ($object) {
return $object;
});
$this->assertEquals($object, $object::getDefault());
}
< /code>
Проблема в том, что это, конечно, не сработает (и справедливо так), потому что анонимная функция не имеет никакой возвратной теги. < /p>
Однако я не могу этого сделать, потому что класс анонимный, поэтому я не знаю, как я бы назвал его имя. < /p>
Во -вторых, даже если я пропустил этот сценарий и проверил другие методы, проблема в том, что я также должен проверить, если это работает, когда этот класс - ребенок этого класса. Но как я мог бы расширить анонимный класс ...  
Я пробую другие методы, такие как $ this-> getmockfortrait () 
, $ this-> getObjectFortrait () но Они устарели с тех пор: https://github.com/sebastianbergmann/ph ... ssues/5244.
После прочтения это я начал Вопрос о том, стоит ли то, что я делал, даже стоило, а если нет, то почему бы и нет. Не только я не могу проверить это, но я также не могу ответить на вопрос, стоит ли я достичь, стоит того.
Есть идеи?

Подробнее здесь: https://stackoverflow.com/questions/794 ... -for-trait
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»