我发现修改由我正在测试的类克隆的模拟对象非常困难。 这是我的测试:
$firstDocument = array('type' => 'venue', 'name'=> "first venue");
$venueContent = $this->getMockBuilder('My\Class\Namespace\VenueContent')->disableOriginalConstructor()->getMock();
$setValues = function($document) use(&$venueContent){
$venueContent->expects($this->any())->method('getDocument')->will($this->returnValue($document));
$venueContent->expects($this->any())->method('getName')->will($this->returnValue($document->name));
};
$venueContent->expects($this->any())->method('setDocument')->will($this->returnCallback($setValues));
$this->object = new ContentFactory();
$this->object->registerContentType('venue', $venueContent);
$firstVenue = $this->object->create($firstDocument);
这是ContentFactory类:
class ContentFactory
{
/**
* @var array classMap
*/
private $contentTypes = array();
/**
* Register a document map for use in creating & validating documents
* @param string $name
* @param array $type
*/
public function registerContentType($name, $type)
{
$this->contentTypes[$name] = $type;
}
/**
* Create & validate a document
* @param array $document
* @throws \InvalidArgumentException
* @return ContentInterface
*/
public function create(array $document)
{
if (!isset($document['type'])) {
throw new \InvalidArgumentException('Unknown content type');
}
$documentType = $document['type'];
if (!\array_key_exists($documentType, $this->contentTypes)) {
throw new \InvalidArgumentException('Unmapped content service');
}
$contentModel = clone $this->contentTypes[$documentType];
$contentDocument = $this->createContentDocument($document);
$contentModel->setDocument($contentDocument);
return $contentModel;
}
/**
* Create underlying ContentDocument
* @param array $document
* @return ContentDocument
*/
private function createContentDocument($document)
{
return new ContentDocument($document);
}
}
我的问题是,每当我执行对象的clone
时,我都无法在测试的回调中修改它,因为我在USE语句中传递的对象是原始对象(我使用的对象)克隆)。
有没有人知道回调如何访问调用者对象,以便我可以修改它,无论它是什么实例而不使用debug_backtrace
?