Как установить возвращаемое значение при использовании расширения test_helpers в PHPUnit - PullRequest
0 голосов
/ 10 июня 2011

Мне недавно дали задание настроить нашу систему для модульного тестирования, но у меня есть одна проблема. Пример в 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 '*';
    }
}
?>

Ответы [ 2 ]

1 голос
/ 10 июня 2011

У ложного класса не будет ожидаемого поведения. Чтобы использовать его как заглушку (делайте X при вызове метода Y), вам нужен доступ к созданному экземпляру BarMock, но это не похоже на то, что новая перегрузка даст вам это.

Вместо этого я бы создал собственный подкласс Bar, который возвращает то, что вы хотите от doSomethingElse().

0 голосов
/ 10 июня 2011

Я не очень понимаю, что вы пытаетесь сделать здесь, но:

  • Вы вызываете getMock (), но на самом деле ничего не присваиваете
  • Чтобы установить возвращаемое значение, см. Пример 11.2: http://www.phpunit.de/manual/3.5/en/test-doubles.html
  • У вас есть странный пробел в 'BarMock'
...