在什么情况下方法是可测试的

时间:2013-05-12 17:13:30

标签: php unit-testing

我想我明白为什么使用其他静态方法的方法难以测试。当我说测试时,我正在考虑单元测试。

举个例子:

class foo {
  protected $objA;
  public function m1() {
    $objA = new A();
    $objA->show();
  }

  public function m2() {
    A::show();
  }

  public function m3() {
    $this->objA->show();
  }

  public function m4($objA) {
    $objA->show();
  }

}
  • m1易于测试吗?我想不是因为你不能模仿那个对象。
  • m2是静态使测试困难的情况吗?
  • m3是一种很好的可测试方法吗?
  • m4是一种很好的可测试方法吗?

我做对了吗?

1 个答案:

答案 0 :(得分:1)

M1并不完美,因为你在方法本身中有一个类的具体引用,所以你是正确的,因为你将无法模拟它。在这种情况下,您应该使用依赖注入将对象引用传递给方法。

M2几乎是相同的情况,因为它使用的是具体参考,但正如您所指出的,它使用的是静态方法。静态方法很难模拟,因为没有办法创建一个定义静态方法的接口(我说的是.Net背景,我不确定你是否可以在PHP中接口静态方法,但我对此表示怀疑)。 / p>

M3,看起来你正在使用属性注入,在这种情况下是的,这是一个容易模拟的测试,因为该对象在类本身之外被实例化并传递给它。

M4与M3相同,因为依赖注入以方法参数的形式出现。

理想情况下,依赖注入应该在类级别完成,可以使用属性或构造函数参数。构造函数参数通常被视为首选方法,因为属性注入(至少从我的角度来看)有点松散,而构造函数注入会强制您创建一个具有所需依赖关系的类。