При тестировании с PHPSpec, как я могу использовать интерфейсы классов, введенные в мои методы, а не конкретный класс?
Например, у меня есть Product
класс, который вводит VariationInterface
в метод:
/**
* ...
*/
public function addVarient(VarientInterface $varient)
{
return $this->varients->add($varient);
}
Хотя, поскольку PHPSpec не имеет контейнера IOC для привязки VarientInterface
в Varient
Я действительно не могу проверить свои занятия.
Разве это не лучшая практика, чтобы кодировать интерфейс, а не конкретный класс?
Вы можете макетировать конкретные классы и интерфейсы в PHPSpec.
Пожалуйста, проверьте этот пример:
<?php
//file spec/YourNameSpace/ProductSpec.php
namespace spec\YourNameSpace\Product;
use YourNameSpace\VarientInterface;
use PhpSpec\ObjectBehavior;
class ProductSpec extends ObjectBehavior
{
function it_is_varients_container(VarientInterface $varient)
{
$this->addVarient($varient);
$this->getVarients()->shouldBe([$varient]);
}
}
Вы просто передаете VarientInterface в качестве параметра для метода тестирования.
Этот VarientInterface смоделирован PhpSpec (на самом деле, Пророчеством).
Пожалуйста, проверьте официальную документацию phpspec о насмешках http://www.phpspec.net/docs/introduction.html#prophet-objects
Других решений пока нет …