传递给Foo :: __ construct()的参数1必须是Psr \ Log \ LoggerTrait的实例,给出Mock_Trait_LoggerTrait_65811a25_bdddd884的实例

时间:2015-03-09 20:40:45

标签: php unit-testing mocking phpunit traits

我正在尝试用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);
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您无法输入提示特征。您的类型提示正在查找类型为\Psr\Log\LoggerTrait的类。看起来它实际上是一种特质,而不是一个对象。

http://php.net/manual/en/language.oop5.typehinting.php

getMockForTrait方法用于创建特征的具体对象,以便您可以测试特征功能。它创建了一个对象,该对象使用traits方法和任何被模拟的抽象方法。它没有扩展特征,因此类型提示无效。

https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mocking-traits-and-abstract-classes

你似乎在滥用自己想要做的事情。特性是PHP允许类共享功能而无需相互扩展的方式。特征无法实例化,它们将用于在其他不相关的对象之间共享功能。

你的特质"应该只是你传入的一个班级。然后你的考试将成为:

public function testRun ()
{
    $logger = $this->getMock('\Psr\Log\Logger');  //Changed name to not be Trait

    $sut = new Foo($logger);
}