1

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

举个例子:

类富 {
  受保护的$objA;
  公共函数 m1() {
    $objA = 新 A();
    $objA->show();
  }

  公共函数 m2() {
    一场表演();
  }

  公共函数 m3() {
    $this->objA->show();
  }

  公共函数 m4($objA) {
    $objA->show();
  }

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

我做对了吗?

4

1 回答 1

1

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

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

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

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

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

于 2013-05-12T17:34:28.510 回答