【发布时间】:2013-03-20 06:39:41
【问题描述】:
我正在尝试学习单元测试,但遇到以下情况,我无法理解:
- 我有一个模型:SalesOrder - 为电子商务商店中的订单建模
- SalesOrder 有一个名为 gift_message_id 的属性
- 礼品消息 ID 是一个整数值,是 GiftMessage 模型的外键
- GiftMessage 模型有一个方法可以接受订单模型并根据 SalesOrder 正确加载 GiftMessage 实例。
我正在尝试编写一个准确测试此行为的测试,但我最终得到了 2 个模拟:1 个用于 SalesOrder,1 个用于 GiftMessage,它没有意义。我在这里做错了什么?
我尝试测试的方法如下所示:
public function loadGiftMessageByOrderModel(SalesOrder $order)
{
$giftMessageId = $order->getGiftMessageId();
//if the order has a gift message id then load the gift message model and return it
if ($giftMessageId !== false) {
return new GiftMessage($giftMessageId);
}
return false;
}
如何进行单元测试,记住订单和礼物消息数据存储在数据库中。
【问题讨论】:
-
我同意,单元测试是个笑话
-
我认为它很有价值 - 但我只是无法弄清楚如何做到这一点并使测试变得有价值
-
说实话,我不太了解您的描述以及您想要测试的具体内容。一般来说,如果你想测试 X 类,你可以模拟或实例化所有外部实体,不管它们有多少。当然,在这里保持松散耦合是一个优势。
-
我想测试一下,如果订单有礼物消息 id,则返回礼物消息模型,否则返回 false。我可以轻松地模拟 SalesOrder 模型以返回礼品消息 ID。我无法解决的问题是从该 id 加载一个新的 GiftMessage 并返回它。这是因为 GiftMessage 构造函数需要一个 id 并从数据库中加载它
-
如何将数据库连接传递给
GiftMessage对象?你在这里有一些全局状态,这使得你的系统很难被测试并且可能真的有问题。
标签: php unit-testing junit mocking phpunit