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


In what cases is a method testable

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

举个例子:

<>之前类foo {保护objA美元;公共函数m1() {$objA = new A();objA -> show ();}公共函数m2() {:给();}公共函数m3() {$ this -> objA -> show ();}公共函数m4($objA) {objA -> show ();}}之前
  • m1容易测试吗?我不这么认为,因为你不能嘲笑那个对象。
  • m2是静态使测试困难的情况吗?
  • m3是一个好的测试方法吗?
  • m4是一个很好的测试方法吗?

我写对了吗?

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

M2几乎是相同的情况,因为它使用了一个具体的引用,但正如你指出的,它使用了一个静态方法。静态方法很难模拟,因为没有办法创建定义静态方法的接口(我是从。net背景讲的,我不确定是否可以在PHP中为静态方法提供接口,但我对此表示怀疑)。

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

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

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