У меня есть интерфейс, который я хочу высмеять, и издеваться над поведением одного из его методов.
Поэтому я создал обратный вызов, который очень насмехается в поведении.
Этот тест проходит, если я создаю новый объект, основанный на этом интерфейсе, но я хотел бы высмеять интерфейс.
Обманутый метод 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); }
ОК, из интереса, я выяснил проблему. Похоже, что PHPUnit автоматически клонирует параметры до фактического вызова. Я не вижу реальной причины для этого, но, возможно, есть один. Framework/MockObject/Invocation/Static.php
на Framework/MockObject/Invocation/Static.php
, есть только один способ, как вы можете избежать этого (на основе встроенного макет кода): Внедрите частный метод __clone()
в DefaultRenderer
.
Я также предлагаю вам обратиться в IRC или в список рассылки PHPUnit об этом поведении или в библиотеке макетов объектов.