new
对测试不利,乍看起来似乎有道理。
PHP的优秀做法是什么?我应该创建一个工厂类来为每个对象类型实例化一个方法,允许松散耦合吗?或者,使用单个方法初始化new
实例的通用初始化方法(自动加载程序?)是否更合适,尽管后者没有指定返回类型,这使得代码在黑暗中完成IDE。
答案 0 :(得分:2)
好。视频是正确的。每当您在代码的一部分中有new
时,就会使测试更加困难。基本上,没有办法隔离你正在测试的东西。这意味着您需要完整覆盖该类(您在new
语句中的那个),以使您的单元测试真正可靠。
绝对最佳的选择是将所有实例作为依赖项传递(在类或方法中),但通常仅在某些特定层中起作用。例如,如果正确编写,则可以非常简单地删除控制器中的任何new
语句。您只需将服务作为依赖项传递给构造函数,并在“操作调用”中传递Request
抽象或显式值。
因此,传递依赖关系(可能通过使用一些DI容器)是最好的方法。最容易测试的一个。但这不会普遍适用。
您的其余代码可能最终(至少 - 部分)与new
运算符和工厂的混合。
您可以通过使用工厂中的::class
和添加docblock注释来缓解IDE相关问题:
/** @var \Mapper\SalesSomething\Invoice $invoice */
$invoice = $this->factory->create(Invoice::class);
我的个人偏好是:
new
但那只是我的方法