Как автоматически смоделировать класс в классе с помощью phpunit? - PullRequest
1 голос
/ 14 июня 2011

У меня есть такая структура классов:

class A {
    public someFunction() {
        $objectB = new B();
        $result = $objectB->getResult();
        return $result;
    }
}

Я пишу модульный тест для someFunction(), который принадлежит классу A. Однако это зависит от класса B. Я могу издеваться someFunction(), но как мне разрешить зависимость от класса B? Я хочу издеваться над классом B автоматически.

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Использовать внедрение зависимости: либо предоставьте метод для установки объекта B, либо передайте объект b дополнительно someFunction().

Исходный код

class A {
    public function someFunction() {
        $objectB = new B();
        $result = $objectB->getResult();
        return $result;
    }
}

Необязательный параметр

class A {
    public function someFunction($objectB = null) {
        if ($objectB == null) { $objectB = new B(); }
        $result = $objectB->getResult();
        return $result;
    }
}

Метод установки

class A {
    protected $b;


    public function __construct() {
        $this->b = new B();
    }

    public function setB($b) {
        $this->b = $b;
    }

    public function someFunction() {
        $result = $this->b->getResult();
        return $result;
    }
}
1 голос
/ 15 июня 2011

Другая возможность для внедрения зависимостей - это рефакторинг в метод "init", т.е.

class A
{
    function setB ( B $b = null )
    {
        $this->b = ( !is_null($b) ? $b
            $this->initB()
        );
    }

    function initB ( )
    {
       return new B();
    }

    function someMethod ( )
    {
        return $this->b->getResult();
    }
}

В этой реализации подклассы «A» могут переопределять «initB» для изменения зависимости, а макет «A», сгенерированный с помощью «PHPUnit_Framework_TestCase :: getMock ()», может определять возвращаемое значение для метода без использования функциональности. сеттера (или вы можете опустить сеттер).

...