Итак, я пытаюсь перенести один из своих пакетов в тесты PHPSpec, но вскоре столкнулся с этой проблемой. Пакеты — это пакет корзины покупок, поэтому я хочу проверить, что когда вы добавляете два предмета в корзину, корзина имеет счет два, просто. Но, конечно, в корзине при добавлении двух одинаковых товаров в корзине не будет новой записи, но исходный товар получит «количество» равное 2. Так что, но не тогда, когда они, например, разных размеров. Таким образом, каждый элемент идентифицируется уникальным 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?