私はTDDを使用しています。システムで生の SQL クエリを使用する必要があります。TDD は、ビジネス ロジックのみをテストする必要があることを示唆しています (データベース、メール送信、またはファイル システムのすべてのテストは統合テストです)。そのため、モックしたい別のクラスに SQL コードを配置します。コードは次のとおりです。
// Creating shipping method data provider mock
$shippingMethodDataProviderMock = $this->getMockBuilder('\ordersmanager\Model\Order\ShippingMethod\ShippingMethodDataProvider')->disableOriginalConstructor()->getMock();
// Getting shipping method instance
$emsShippingMethod = ShippingMethodFactory::getShippingMethod('ems', $shippingMethodDataProviderMock);
ShippingMethodProviderしかし、インスタンスをShippingMethodFactoryクライアント コードに渡したくありません。
集約の代わりにコンポジションを使用できます。aShippingMethodProviderで aを作成し、それをコンストラクターShippingMethodFactoryに渡します。ShippingMethodしかし、その場合ShippingMethodProvider、クライアント コードから分離されているため、モックできません。
ShippingMethodFactory単体テストされないラッパーを作成できますが、次のような快適な API を作成します。
$emsShippingMethod = ShippingMethodFactory::getShippingMethod('ems');
しかし、このラッパーはテストされません。
これをテストして優れた API を作成するためのより良い方法は何ですか?