В PHPUnit, как имитировать родительские методы?

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

class Parent {

    function foo() {
        echo 'bar';
    }
}

class Child {

    function foo() {
            $foo = parent::foo();
            return $foo;
    }
}

class ChildTest extend PHPUnit_TestCase {

    function testFoo() {
        $mock = $this->getMock('Child', array('foo'));

        //how do i mock parent methods and simulate responses?
    }
}
24
задан james 15 July 2011 в 18:39
поделиться

3 ответа

Вы не издеваетесь и не заглушаете методы в проверяемой теме (SUT). Если вам кажется, что вам нужно смоделировать или заглушить метод в родительском объекте SUT, это, вероятно, означает, что вы должны были использовать не наследование, а агрегацию.

Вы издеваетесь над зависимостями испытуемого. Это означает, что любые другие объекты, которые SUT требует для работы.

20
ответ дан 28 November 2019 в 23:54
поделиться

На мой взгляд, удовлетворительным решением является создание класса, который наследуется от тестируемого вами класса, и переопределяет реализацию метода, который вы хотите дать другой реализации. Это имеет свои недостатки: это не всегда работает, например, для уже переопределенных методов и для частных методов.

class Parent
{
    function bar()
    {
        echo 'bar';
    }
}

class Child extends Parent
{
    function foo()
    {
        parent::bar();
        echo 'foo';
    }
}

class mockChild extends Child
{
    function bar()
    {
        echo 'baz';
    }
}

class ChildTest extends PHPUnit_TestCase 
{
    function testFoo() {
        $sut = new mockChild();
        $sut->foo();
    }
} 
0
ответ дан 28 November 2019 в 23:54
поделиться

Вот как я это сделал, я понятия не имею, если это правильно, но это работает:

class parentClass {
    public function whatever() {
        $this->doSomething();
    }
}

class childClass extends parentClass {
    public $variable;
    public function subjectUnderTest() {
        $this->variable = 'whocares';
        parent::whatever();
    }
}

сейчас в тесте я делаю:

public function testSubjectUnderTest() {
    $ChildClass = $this->getMock('childClass', array('doSomething'))
    $ChildClass->expects($this->once())
               ->method('doSomething');
    $ChildClass->subjectUnderTest();
    $this->assertEquals('whocares', $ChildClass->variable);
}

что за?

Мое рассуждение здесь состоит в том, что все, что я действительно хочу проверить, - это установлена ​​ли моя переменная. меня действительно не волнует, что происходит в родительском методе, но так как вы не можете предотвратить вызов родительского метода, то, что я делаю, это высмеивает зависимые методы родительского метода.

А теперь иди и скажи мне, что я не прав :)

4
ответ дан 28 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: