Передать по ссылке в обратном вызове, когда насмехается в PHPUnit

У меня есть интерфейс, который я хочу высмеять, и издеваться над поведением одного из его методов.

Поэтому я создал обратный вызов, который очень насмехается в поведении.

Этот тест проходит, если я создаю новый объект, основанный на этом интерфейсе, но я хотел бы высмеять интерфейс.

Обманутый метод setUp вызывается штрафом, и вызов getVar ('testing') в моем обратном вызове возвращает значение. Однако мое утверждение терпит неудачу, потому что это значение недоступно.

Кажется, что вы не можете сделать это в PHPUnit? Если я не буду глуп.

Краткое описание потока кода; Код в «getVar» вызывает метод, который вызывает «setUp» в добавленном плагине. Когда он вызывает «setUp», он переходит в «$ this». Это $ this, которого я ожидаю передать по ссылке и которая работает с «реальным» объектом.

class DefaultRendererTest extends \PHPUnit_Framework_TestCase { public function testSetGetVar() { $theme = $this->getMock('ThemeInterface'); $plugin = $this->getMock('PluginInterface'); $plugin->expects($this->once()) ->method('setUp') ->will($this->returnCallback(function($r){ $r->setVar('testing', "fooBar"); })); $renderer = new DefaultRenderer($theme, null); $renderer->addPlugin($plugin); $this->assertEquals('fooBar',$renderer->getVar('testing')); } } 

Для информации здесь интерфейс, DefaultRenderer реализует RendererInterface

 interface PluginInterface { function setUp(RendererInterface $renderer); } 

Related of "Передать по ссылке в обратном вызове, когда насмехается в PHPUnit"

ОК, из интереса, я выяснил проблему. Похоже, что PHPUnit автоматически клонирует параметры до фактического вызова. Я не вижу реальной причины для этого, но, возможно, есть один. Framework/MockObject/Invocation/Static.php на Framework/MockObject/Invocation/Static.php , есть только один способ, как вы можете избежать этого (на основе встроенного макет кода): Внедрите частный метод __clone() в DefaultRenderer .

Я также предлагаю вам обратиться в IRC или в список рассылки PHPUnit об этом поведении или в библиотеке макетов объектов.