【发布时间】:2014-12-03 21:38:01
【问题描述】:
好的,所以我正在尝试将我的一个包转移到 PHPSpec 测试,但很快我遇到了这个问题。 packages 是一个购物车包,所以我想测试一下,当您将两个商品添加到购物车时,购物车的计数为 2,很简单。 但是当然,在购物车中,当添加两个相同的商品时,购物车中不会有新条目,但原始商品的“数量”将为 2。不同的尺寸。 因此,每个项目都由一个唯一的 rowId 标识,基于它的 ID 和选项。
这是生成 rowId 的代码(由add() 方法使用):
protected function generateRowId(CartItem $item)
{
return md5($item->getId() . serialize($item->getOptions()));
}
现在我的测试是这样写的:
public function it_can_add_multiple_instances_of_a_cart_item(CartItem $cartItem1, CartItem $cartItem2)
{
$this->add($cartItem1);
$this->add($cartItem2);
$this->shouldHaveCount(2);
}
但问题是,对于 getId() 方法,两个存根都返回 null。所以我尝试为该方法设置willReturn(),所以我的测试变成了这样:
public function it_can_add_multiple_instances_of_a_cart_item(CartItem $cartItem1, CartItem $cartItem2)
{
$cartItem1->getId()->willReturn(1);
$cartItem2->getId()->willReturn(2);
$this->add($cartItem1);
$this->add($cartItem2);
$this->shouldHaveCount(2);
}
但现在我得到错误,告诉我意外的方法被称为getName()。所以我必须对 CartItem 接口上被调用的所有方法执行相同的操作:
public function it_can_add_multiple_instances_of_a_cart_item(CartItem $cartItem1, CartItem $cartItem2)
{
$cartItem1->getId()->willReturn(1);
$cartItem1->getName()->willReturn(null);
$cartItem1->getPrice()->willReturn(null);
$cartItem1->getOptions()->willReturn([]);
$cartItem2->getId()->willReturn(2);
$cartItem2->getName()->willReturn(null);
$cartItem2->getPrice()->willReturn(null);
$cartItem2->getOptions()->willReturn([]);
$this->add($cartItem1);
$this->add($cartItem2);
$this->shouldHaveCount(2);
}
现在可以了,测试是绿色的。但感觉不对……我是遗漏了什么还是对 PHPSpec 的限制?
【问题讨论】:
标签: php testing mocking phpspec stubs