Аргумент 1, передаваемый в Foo :: __ construct (), должен быть экземпляром Psr \ Log \ LoggerTrait, заданным экземпляром Mock_Trait_LoggerTrait_65811a25_bdddd884

Я пытаюсь смоделировать простую черту с PHPUnit, но это приводит к FatalError, он работает, если я удаляю подсказку типа: Аргумент 1, передаваемый в Foo :: __ construct (), должен быть экземпляром Psr \ Log \ LoggerTrait, instance 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);
}
}

Как мне это решить?

2

Решение

Вы не можете напечатать черты подсказки. Ваш тип подсказки ищет класс типа \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);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]