PHPUnit模拟父保护方法,即owerriden

时间:2015-06-02 10:49:04

标签: php unit-testing phpunit

我怎样才能测试方法Bar :: foo?

class Foo {
    protected function foo() {
        // Do something
    }
}

class Bar extends Foo {
    protected function foo() {
        parent::foo();
        // Do something else
    }
}

我需要模拟Foo :: foo而不是

Fatal error: Access level to Bar::foo() must be public (as in class Foo)...

...

1 个答案:

答案 0 :(得分:0)

您无需模拟Foo::foo来测试您的方法。它调用父foo方法的事实是一个实现细节。您无需确保Bar对象调用任何Foo方法。您唯一要断言的是BarFoo的实例。

从您的示例中,您甚至不需要显式测试Bar::foo,因为它是受保护的方法。如果Bar::foo足够复杂,您认为需要为其编写测试。考虑将其重构为自己的类,并使用Bar的策略模式。

您不希望测试检查是否调用内部方法。这使得重构您的课程变得更加困难。如果您要将Foo::foo中的所有行复制到Bar::foo,则应通过测试。这不是很好的编码实践。但测试无法确保良好的代码。他们确保代码正常工作。