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

问题描述:

我想我明白为什么使用其他静态方法的方法很难测试。当我说测试时,我在考虑单元测试。在什么情况下是可测试的方法

拿这个例子:

 
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是一个很好的可测试方法吗?

我有这个权利吗?

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

M2几乎是一样的情况,因为它使用了一个具体的引用,但正如你所指出的那样,它使用的是静态方法。静态方法很难嘲笑,因为没有办法创建一个定义静态方法的接口(我从.Net背景说起,我不确定你是否可以在PHP中接口静态方法,但我怀疑它)。 M3,看起来像你正在使用属性注入,在这种情况下,是的,这是一个容易模拟的测试,因为对象在类本身之外被实例化并传递给它。

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

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