我正在使用 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
客户端代码。
我可以使用组合而不是聚合:ShippingMethodProvider
在 a 中创建 aShippingMethodFactory
并将其传递给ShippingMethod
构造函数。但在那种情况下,我无法模拟ShippingMethodProvider
,因为它与客户端代码隔离。
ShippingMethodFactory
我可以为它创建一个不会经过单元测试的包装器,但会创建一个像这样令人愉快的 API:
$emsShippingMethod = ShippingMethodFactory::getShippingMethod('ems');
但是这个包装器不会被测试。
有什么更好的方法来测试这个并拥有一个好的 API?