Php 传递给Foo::_construct()的参数1必须是给定的Psr\Log\LoggerTrait、Mock_Trait_LoggerTrait_65811a25_bdddd884的实例
我试图用PHPUnit模拟一个简单的trait,但这会导致一个致命的错误,如果我删除传递给Foo的类型提示:参数1::\uu construct()必须是Psr\Log\LoggerTrait的实例,mock\u trait\u LoggerTrait的实例 班级:Php 传递给Foo::_construct()的参数1必须是给定的Psr\Log\LoggerTrait、Mock_Trait_LoggerTrait_65811a25_bdddd884的实例,php,unit-testing,mocking,phpunit,traits,Php,Unit Testing,Mocking,Phpunit,Traits,我试图用PHPUnit模拟一个简单的trait,但这会导致一个致命的错误,如果我删除传递给Foo的类型提示:参数1::\uu construct()必须是Psr\Log\LoggerTrait的实例,mock\u trait\u LoggerTrait的实例 班级: use Psr\Log\LoggerTrait; class Foo { /** * @var LoggerTrait */ private $mLogger; public func
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
的类。看起来它实际上是一种特征,而不是一个对象
getMockForTrait方法用于创建trait的具体对象,以便测试traits功能。它创建了一个对象,该对象使用traits方法来模拟任何抽象方法。它不扩展trait,因此类型提示无效
你似乎滥用了你想要做的事情的特点。一个特点是PHP允许类共享功能而不需要彼此扩展。特征不能被实例化,它们将用于在其他不相关的对象之间共享功能
你的“特质”应该只是你传递的一个类。然后你的测试就会变成:
public function testRun ()
{
$logger = $this->getMock('\Psr\Log\Logger'); //Changed name to not be Trait
$sut = new Foo($logger);
}
我该如何解决这个问题?将一个实例从类
LoggerTrait
传递给构造函数?!我发现这也很棘手。如果您进行var_转储($logger);在yoiur getMockForTrait之后,它是“LoggerTrait”类型的对象吗。您肯定不想删除您的类型提示。那太糟糕了。我解决这个问题的一种方法是在测试助手中创建一个存根特征,然后将其交给getMockForTrait。很差劲,但很管用。