Кто-нибудь знает, как издеваться над доктриной PersistentCollection?
Когда я пытаюсь и издеваться над классом напрямую с помощью PHPUnit и Mockery, я получаю исключение, которое гласит:
Mockery\Exception: The class Doctrine\ORM\PersistentCollection is marked final a
его методы не могут быть заменены. Классы, помеченные как final, могут быть переданы в \ Moc kery :: mock () в качестве экземпляров объектов для создания частичного макета, но только в том случае, если m ock не подлежит проверке типа.
Мои исследования показывают, что Mockery и / или phpUnit не могут использовать отражение, если методы отмечены как окончательные.
Затем я попытался создать stdClass и дать ему методы, которые будет использовать итератор (valid / current / next), но цикл foreach не будет вызывать их, если класс не реализует итератор.
Таким образом, следующий код не работает …
$this -> collectionMock = \Mockery::mock('PersistentCollection, Traversable'); $this -> collectionMock -> shouldReceive('rewind'); $this -> collectionMock -> shouldReceive('valid') -> andReturn('true'); $this -> collectionMock -> shouldReceive('next'); $this -> collectionMock -> shouldReceive('current') ->andReturn();
И бросает, кажется, бросает следующую фатальную ошибку:
Fatal error: Cannot redeclare Mockery_1670979900_PersistentCollection_Traversable::rewind() in C:\zendProject\zf2\vendor\mockery\mockery\library\Mockery\Generator.php(129) : eval()'d code on line 43
Кто-нибудь придумал хороший способ издеваться над этим классом
Я не думаю, что можно высмеять класс, который был объявлен окончательным. Однако может быть какая-то надежда. Поскольку PersistentCollection
реализует как Doctrine\Common\Collections\Collection
и Doctrine\Common\Collections\Selectable
, вы можете использовать Mockery для издевательства над объектом, реализующим оба интерфейса.
Mockery::mock( 'Doctrine\Common\Collections\Collection, Doctrine\Common\Collections\Selectable' );
Я использовал это для хорошего эффекта в одном из моих собственных проектов.
Что касается того, почему вы не можете высмеивать последний класс, это лучшее, что я мог найти:
издевательство
Способность высмеивать финальные классы с помощью Mockery ограничена :
Опять же, основная цель состоит в том, чтобы гарантировать, что макет объекта наследует определенный тип для намека типа. Существует исключение в том, что классы, отмеченные как final, или методы, отмеченные как final, не могут быть полностью издевательскими. В этих случаях необходимо использовать частичный макет (объясненный позже).
$mock = \Mockery::mock('alias:MyNamespace\MyClass');
Найдите ссылку на страницу «final». Вы найдете всю документацию, которую я могу найти.
PHPUnit
Попытка высмеять окончательный класс в PHPUnit создает исключение по дизайну .