Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 传递给Foo::_construct()的参数1必须是给定的Psr\Log\LoggerTrait、Mock_Trait_LoggerTrait_65811a25_bdddd884的实例_Php_Unit Testing_Mocking_Phpunit_Traits - Fatal编程技术网

Php 传递给Foo::_construct()的参数1必须是给定的Psr\Log\LoggerTrait、Mock_Trait_LoggerTrait_65811a25_bdddd884的实例

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

我试图用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 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。很差劲,但很管用。