1

在 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 中执行此操作的最佳方法是什么?

4

2 回答 2

6

您可以使用内联匹配器

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;
            }
        );
    }
}
于 2013-11-03T07:55:03.667 回答
1

PHP 没有特定类型的数组,因此 PHP 规范无法直接测试。您可以一遍又一遍地移植强制性代码并将其推送到您的规范中,只是为了控制您的类的行为就像您指定的那样,或者您可以创建这样的数组类型并对其进行规范。

这将允许您将规范移动到这种类型的单个对象,规范一次并在任何地方使用它。

一个看起来不错的基本类型是 SPL SplObjectStorage,您可以扩展并将该类型作为参数或第一个添加要接受的类型。

于 2013-11-05T13:37:08.773 回答