在PHPUnit中,如何模拟父方法?

jam*_*mes 24 php testing phpunit mocking

我想测试一个调用具有相同名称的父方法的类方法.有没有办法做到这一点?

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 20

你不要在被测对象(SUT)中模拟或存根方法.如果您觉得需要在SUT的父级中模拟或存根方法,则可能意味着您不应该使用继承,而是使用聚合.

您模拟了测试对象的依赖关系.这意味着SUT需要做的任何其他对象.

  • 哇,这在很多层面都是错的.特别是**单元**测试要求您模拟SUT的所有使用方法,测试方法除外.通过构建现有功能来扩展对象没有任何问题,这就是你合法地需要调用父方法的时候. (4认同)

小智 8

对我有用的方法是在子类上实现父调用的包装,最后模拟那些包装.

你修改了代码:

class Parent {

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

class Child {

    function foo() {
            $foo = $this->parentFooCall();
            return $foo;
    }
    function parentFooCall() {
            return parent::foo();
    }
}

class ChildTest extend PHPUnit_TestCase {

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

        //how do i mock parent methods and simulate responses?
    }
 }
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的问题在于,您只是为了测试目的而对孩子实施方法,这不是一个好的开发方法. (10认同)
  • 然后你不能单元测试parentFooCall() (3认同)