私は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 を作成するためのより良い方法は何ですか?