【问题标题】:How to do hasKeys() in PHP Mockery, or create custom parameter expectations?如何在 PHP Mockery 中做 hasKeys(),或者创建自定义参数期望?
【发布时间】:2014-12-01 00:38:12
【问题描述】:

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

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

谢谢。

编辑:

例子

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

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

【问题讨论】:

  • 您应该添加一个代码示例来可视化您想要获取的内容。你使用什么测试框架?
  • 我已经更新了我的问题,谢谢。我正在使用 PHPunit,不知何故忘了提及。
  • 为什么在测试中拥有这些键很重要?该方法是否对丢失的键进行错误处理?您是否对缺少预期键的情况进行了另一次测试?如果不看方法本身,很难判断您是否需要像麦芽糖提供的第一个答案那样的技术解决方案,或者您是否需要重新考虑您的测试,甚至因为复杂性而需要重新考虑方法。

标签: php unit-testing mocking phpunit mockery


【解决方案1】:

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

在我的脑海中(未经测试)这可能看起来像这样:

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));

【讨论】:

  • 感谢您的出色回答。我正在实现这个并有一个建议:方法hasKeys() 应该在语义上类似于hasKey()。在 hasKey() 匹配器的原始实现中:public function match(&amp;$actual) { return in_array($this-&gt;_expected, array_keys($actual)); } 具有 NULL 值的哈希数组元素将返回 true (如 hasKey() 建议的那样。而在您的代码中,您使用 isset() 它将在具有有效键但 NULL 值的数组上返回 false . 我建议将!isset($actual[$expectedKey]) 改为!array_key_exists($expectedKey, $actual)
  • 观察了一下,既然你提到了它,我记得有一次被绊倒了……我已经按照你的建议编辑了代码,谢谢……!
猜你喜欢
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多