【问题标题】:PHPUnit mock parent protected method, which is owerridenPHPUnit mock parent protected 方法,被 owerriden
【发布时间】:2015-06-02 10:49:04
【问题描述】:

如何测试方法 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)...

??

【问题讨论】:

  • 您确定Foo::foo 受到保护吗?错误消息告诉您否则。 Foo::foo 在那里是公开的,这意味着 Bar 正在破坏继承的合同。子类可以将protected 方法变成public 方法(增加可见性),但它不能限制可见性(即publicprotected 是不允许的)。无论哪种方式:使用反射类将方法公开并设置
  • 当我试图模拟它时它会公开。
  • 你在模拟什么类/对象,在哪里以及如何? BarFoo,您如何将可见性更改为 public?显示代码

标签: php unit-testing phpunit


【解决方案1】:

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

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

您不希望您的测试检查是否调用了内部方法。这使得重构你的类变得更加困难。如果您要将所有行从Foo::foo 复制到Bar::foo,您的测试应该通过。这不是好的编码习惯。但是测试并不能保证好的代码。他们确保代码正常工作。

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2016-01-05
    • 2015-10-27
    • 2015-04-04
    • 1970-01-01
    • 2011-08-24
    • 2012-11-17
    • 2014-07-06
    • 2014-02-08
    相关资源
    最近更新 更多