gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:57:45 24 4
gpt4 key购买 nike

我正在尝试用 PHPUnit 模拟一个简单的特征,但它导致了 fatal error ,如果我删除类型提示,它会起作用:传递给 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);
}
}

我应该如何解决这个问题?

最佳答案

你不能输入提示特征。您的类型提示正在寻找类型为 \Psr\Log\LoggerTrait 的类.看起来它实际上是一个特征而不是一个对象。

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

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

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

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

你的“特质”应该只是你传入的一个类。然后你的测试将变成:

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

$sut = new Foo($logger);
}

关于php - 传递给 Foo::__construct() 的参数 1 必须是 Psr\Log\LoggerTrait 的实例,给出的 Mock_Trait_LoggerTrait_65811a25_bdddd884 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28951325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com