在phpspec中,如何测试类属性是否包含特定类型的数组?
例如:
class MyClass
{
private $_mySpecialTypes = array();
// Constructor ommitted which sets the mySpecialTypes value
public function getMySpecialTypes()
{
return $this->_mySpecialTypes;
}
}
我的规格如下:
public function it_should_have_an_array_of_myspecialtypes()
{
$this->getMySpecialTypes()->shouldBeArray();
}
但我想确保数组中的每个元素都是MySpecialType
在phpspec中最好的方法是什么?
答案 0 :(得分:6)
您可以使用inline matcher:
namespace spec;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use MySpecialType;
class MyArraySpec extends ObjectBehavior
{
function it_should_have_an_array_of_myspecialtypes()
{
$this->getMySpecialTypes()->shouldReturnArrayOfSpecialTypes();
}
function getMatchers()
{
return array(
'returnArrayOfSpecialTypes' => function($mySpecialTypes) {
foreach ($mySpecialTypes as $element) {
if (!$element instanceof MySpecialType) {
return false;
}
}
return true;
}
);
}
}
答案 1 :(得分:1)
PHP没有特定类型的数组,因此PHP规范无法直接测试。您可以反复移植必需代码并将其推送到您的规范中,只是为了控制您的类的行为,就像您指定它们一样,或您可以创建这样的数组类型并对其进行规范。
这样您就可以将规格移动到这种类型的单个对象,将其指定一次并在任何地方使用它。
一个可能很好看的基类型是SPL'SplObjectStorage
你可以扩展并使类型成为参数或第一个添加类型的接受。