1

我正在使用 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?

4

0 回答 0