Как я высмеиваю Doctrine PersistentCollection в PHPUnit

Кто-нибудь знает, как издеваться над доктриной 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 

Кто-нибудь придумал хороший способ издеваться над этим классом

Solutions Collecting From Web of "Как я высмеиваю Doctrine PersistentCollection в PHPUnit"

Я не думаю, что можно высмеять класс, который был объявлен окончательным. Однако может быть какая-то надежда. Поскольку 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 создает исключение по дизайну .