Мне недавно дали задание настроить нашу систему для модульного тестирования, но у меня есть одна проблема. Пример в http://sebastian -bergmann.de / archives / 885-Stubbing-Hard-Coded-Dependencies.html очень похож на код, который я пытаюсь протестировать. Единственное, что мне нужно сделать, это заставить doSomethingElse()
вернуть что-то по моему выбору.
UPDATE
Я попытался установить getMock
для некоторой переменной, а затем установить возвращаемое значение. Но PHPUnit, кажется, не замечает переменную и возвращаемое значение, которое я установил. Это потому, что я предполагаю, что эта переменная никогда нигде не используется. Но с тем, как настроен код, нет способа передать фиктивный объект в foo, поэтому он знает, что использовать его вместо фактического класса Bar. Я добавил в класс Foo и Bar для более удобного использования. Исходный класс Bar возвращает *, но я хочу, чтобы он возвращал ** из ложного класса.
Использование set_new_overload()
не является обязательным для этого теста, но пока его использование - единственный способ успешно смоделировать Бар.
<?php
require_once 'Foo.php';
class FooTest extends PHPUnit_Framework_TestCase {
protected function setUp()
{
$mock = $this->getMock(
'Bar', /* name of class to mock */
array('doSomethingElse'), /* list of methods to mock */
array(), /* constructor arguments */
'BarMock' /* name for mocked class */
);
$mock->expects($this->any())
->method("doSomthingElse")
->will($this->returnValue("**")
);
set_new_overload(array($this, 'newCallback'));
}
protected function tearDown()
{
unset_new_overload();
}
protected function newCallback($className)
{
switch ($className) {
case 'Bar':
return 'BarMock';
default:
return $className;
}
}
public function testDoSomething()
{
$foo = new Foo;
$this->assertTrue($foo->doSomething());
}
}
?>
<?php
require_once 'Bar.php';
class Foo {
public function doSomething()
{
// ...
$bar = new Bar;
$bar->doSomethingElse();
// ...
return TRUE;
}
}
?>
<?php
class Bar {
public function doSomethingElse()
{
return '*';
}
}
?>