在什么情况下是可测试的方法
问题描述:
我想我明白为什么使用其他静态方法的方法很难测试。当我说测试时,我在考虑单元测试。在什么情况下是可测试的方法
拿这个例子:
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相同,因为依赖注入是以方法参数的形式出现的。
理想情况下,依赖注入应该在类级别完成,或者使用属性或构造函数参数。构造函数参数通常被视为首选方法,因为至少从我的角度来看,属性注入有点松散,而构造函数注入则强制您创建一个具有它所需的每个依赖项的类。