好的,所以我试图将我的一个包移到 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);
}
但问题是,两个存根都返回null
该getId()
方法。所以我尝试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 的限制?