如何在PHP Mockery中使用hasKeys(),或创建自定义参数期望?

时间:2014-10-06 17:29:29

标签: php unit-testing mocking phpunit mockery

Mockery有一个方法hasKey(),它检查给定参数是否有某个键。我想确保传递的数组有多个键。我还想声明数组有x个元素。

是否有内置方式允许自定义参数预期?我尝试使用一个基于给定参数返回true或false的闭包,但是没有用。

感谢。

编辑:

实施例

$obj = m::mock('MyClass');
$obj->shouldReceive('method')->once()->with(m::hasKey('mykeyname'));

我想要做的是更深入地了解使用with()传递给方法的内容。我想声明传递给方法的数组同时具有键a和键b。如果我能以某种方式使用闭包来创建我自己的断言,例如计算数组元素的数量,那就太好了。

1 个答案:

答案 0 :(得分:3)

您可以使用自定义匹配器。

从我的头顶(未经测试)看起来像这样:

class HasKeysMatcher extends \Mockery\Matcher\MatcherAbstract
{
    protected $expectedNumberOfElements;
    public function __construct($expectedKeys, $expectedNumberOfElements)
    {
        parent::__construct($expectedKeys);
        $this->expectedNumberOfElements =$expectedNumberOfElements;
    }

    public function match(&$actual)
    {
        foreach($this->_expected as $expectedKey){
            if (!array_key_exists($expectedKey, $actual)){
                return false;
            }
        }
        return $this->expectedNumberOfElements==count($actual);
    }

    /**
     * Return a string representation of this Matcher
     *
     * @return string
     */
    public function __toString()
    {
        return '<HasKeys>';
    }

}

然后像这样使用它:

$obj = m::mock('MyClass'); $obj->shouldReceive('method')->once()->with(new HasKeysMatcher(array('key1','key2'),5));