Я пытаюсь смоделировать простую черту с PHPUnit, но это приводит к FatalError, он работает, если я удаляю подсказку типа: Аргумент 1, передаваемый в Foo :: __ construct (), должен быть экземпляром Psr \ Log \ LoggerTrait, instance Mock_Trait_LoggerTrait_65811a25_bdddd884 дано
Класс:
use Psr\Log\LoggerTrait;
class Foo {
/**
* @var LoggerTrait
*/
private $mLogger;
public function __construct(LoggerTrait $iLogger)
{
$this->mLogger = $iLogger;
}
}
Тест:
class FooTest extends \PHPUnit_Framework_TestCase
{
public function testRun ()
{
$logger = $this->getMockForTrait('\Psr\Log\LoggerTrait');
$sut = new Foo($logger);
}
}
Как мне это решить?
Вы не можете напечатать черты подсказки. Ваш тип подсказки ищет класс типа \Psr\Log\LoggerTrait
, Похоже, что это на самом деле черта, а не объект.
http://php.net/manual/en/language.oop5.typehinting.php
Метод getMockForTrait используется для создания конкретного объекта признака, чтобы вы могли проверить функциональность признаков. Он создает объект, который использует методы traits с любыми абстрактными методами. Это не расширяет черту, поэтому подсказка типа недопустима.
Вы, кажется, неправильно используете черты в том, что вы хотите сделать. Особенностью является способ PHP, позволяющий классам совместно использовать функциональные возможности без необходимости расширять друг друга. Черты не могут быть созданы, они будут использоваться для обмена функциональными возможностями между другими несвязанными объектами.
Ваша «черта» должна быть просто классом, который вы проходите. И тогда ваш тест станет:
public function testRun ()
{
$logger = $this->getMock('\Psr\Log\Logger'); //Changed name to not be Trait
$sut = new Foo($logger);
}
Других решений пока нет …