使用PHPSpec测试时,如何使用注入到方法中的类接口,而不是实际的具体类?
例如,我有一个Product
类,将VariationInterface
注入到方法中:
/**
* ...
*/
public function addVarient(VarientInterface $varient)
{
return $this->varients->add($varient);
}
尽管由于PHPSpec没有将
VarientInterface
绑定到Varient
的IOC容器,所以我无法真正测试我的类。编码到接口而不是具体的类不是最佳实践吗?
最佳答案
您可以在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(实际上是Prophecy)的模拟下。
请检查有关模拟http://www.phpspec.net/docs/introduction.html#prophet-objects的官方phpspec文档