さて、パッケージの 1 つを PHPSpec テストに移行しようとしていますが、すぐにこの問題に遭遇しました。パッケージは shoppingcart パッケージなので、カートに 2 つのアイテムを追加すると、カートのカウントが 2 になることを簡単にテストしたいと思います。しかしもちろん、ショッピングカートに同じアイテムを 2 つ追加すると、カートに新しいエントリはありませんが、元のアイテムの「数量」は 2 になります。異なるサイズ。そのため、各アイテムは、その ID とオプションに基づいて、一意の rowId によって識別されます。
これは、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の制限ですか?