我正在尝试用PHPUnit模拟一个简单的特性,但它导致了一个FatalError,如果我删除了类型提示它就有效:传递给Foo :: __ construct()的参数1必须是Psr \ Log \的实例LoggerTrait,给出了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);
}
}
我该如何解决这个问题?
答案 0 :(得分:3)
您无法输入提示特征。您的类型提示正在查找类型为\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);
}