Я реализовал __clone
в классе для клонирования дочерних объектов (т.е. глубокое клонирование.)
Я хочу написать тесты, чтобы убедиться, что этот процесс правильно реализован.
Когда я высмеиваю дочерний объект и пытаюсь установить ожидание в ‘__clone’, PHPUnit выдает ошибку, потому что метод не определен. Это пример того, как я пытаюсь написать утверждение.
<?php
public function testClone()
{
$mockChildObject = $this->createMock(ChildObject::class);
$mockChildObjectClone = $this->createMock(ChildObject::class);
$mockChildObject->expects($this->once())->method('__clone')->willReturn($this->createMock($mockChildObjectClone));
$object = new MyObject();
$object->addChild($mockChildObject);
$objectClone = clone $object;
$this->assertSame($mockChildObjectClone, $objectClone->getChild());
}
Полученная ошибка гласит:
Попытка настроить метод «__clone», который не может быть настроен, поскольку он не существует, не указан, является окончательным или статическим
__clone
Метод не реализован на дочерних объектах, так как клонирования по умолчанию достаточно.
Я также пытался использовать $this->getMockBuilder()
с различными комбинациями disableOriginalClone()
/enableOriginalClone()
а также enableArgumentCloning()
/diableArgumentCloning()
,
Единственный способ, которым я могу думать о тестовом клонировании, — это написать другой класс, который расширяет дочерний объект и реализует __clone()
, Но это кажется чрезмерным, и я уверен, что должно быть более практичное решение.
Задача ещё не решена.
Других решений пока нет …