热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHPUnit:验证该数组是否具有给定值的键-PHPUnit:Verifyingthatarrayhasakeywithgivenvalue

Giventhefollowingclass:鉴于以下课程:<?phpclassExample{private$Other;publicfunctio

Given the following class:

鉴于以下课程:

Other = $Other;
    }

    public function query ()
    {   
        $params = array(
            'key1' => 'Value 1'
            , 'key2' => 'Value 2'
        );

        $this->Other->post($params);
    }
}

And this testcase:

而这个测试用例:

getMock('Other', array('post'));

        $Mock->expects($this->once())
              ->method('post')
              ->with(YOUR_IDEA_HERE);

        $Example = new Example($Mock);
        $Example->query();
    }

How do I verify that $params (which is an array) and is passed to $Other->post() contains a key named 'key1' that has a value of 'Value 1'?

如何验证$ params(这是一个数组)并传递给$ Other-> post()包含一个名为'key1'的键,其值为'Value 1'?

I do not want to verify all of the array - this is just a sample code, in actual code the passed array has a lot more values, I want to verify just a single key/value pair in there.

我不想验证所有的数组 - 这只是一个示例代码,在实际代码中传递的数组有更多的值,我想在那里只验证一个键/值对。

There is $this->arrayHasKey('keyname') that I can use to verify that the key exists.

我可以使用$ this-> arrayHasKey('keyname')来验证密钥是否存在。

There is also $this->contains('Value 1'), which can be used to verify that the array has this value.

还有$ this-> contains('Value 1'),可用于验证数组是否具有此值。

I could even combine those two with $this->logicalAnd. But this of course does not give the desired result.

我甚至可以将这两个与$ this-> logicalAnd结合起来。但这当然不会产生预期的结果。

So far I have been using returnCallback, capturing the whole $params and then doing asserts on that, but is there perhaps another way to do what I want?

到目前为止,我一直在使用returnCallback,捕获整个$ params,然后对此进行断言,但是有没有其他方法可以做我想要的?

5 个解决方案

#1


32  

The $this->arrayHasKey('keyname'); method exists but its name is assertArrayHasKey :

$ this-> arrayHasKey('keyname');方法存在,但其名称为assertArrayHasKey:

// In your PHPUnit test method
$hi = array(
    'fr' => 'Bonjour',
    'en' => 'Hello'
);

$this->assertArrayHasKey('en', $hi);    // Succeeds
$this->assertArrayHasKey('de', $hi);    // Fails

#2


15  

In lieu of creating a re-usable constraint class, I was able to assert an array key's value using the existing callback constraint in PHPUnit. In my use case, I needed to check for an array value in the second argument to a mocked method (MongoCollection::ensureIndex(), if anyone is curious). Here's what I came up with:

代替创建可重用的约束类,我能够使用PHPUnit中的现有回调约束来声明数组键的值。在我的用例中,我需要在模拟方法的第二个参数中检查数组值(MongoCollection :: ensureIndex(),如果有人好奇的话)。这就是我想出的:

$mockedObject->expects($this->once())
    ->method('mockedMethod')
    ->with($this->anything(), $this->callback(function($o) {
        return isset($o['timeout']) && $o['timeout'] === 10000;
    }));

The callback constraint expects a callable in its constructor, and simply invokes it during evaluation. The assertion passes or fails based on whether the callable returns true or false.

回调约束期望在其构造函数中使用callable,并在评估期间简单地调用它。断言根据callable是返回true还是false来传递或失败。

For a large project, I'd certainly recommend creating a re-usable constraint (as in the above solution) or petitioning for PR #312 to be merged into PHPUnit, but this did the trick for a one-time need. It's easy to see how the callback constraint might be useful for more complicated assertions, too.

对于一个大型项目,我当然建议创建一个可重用的约束(如上面的解决方案)或请求将PR#312合并到PHPUnit中,但这样做可以满足一次性需求。很容易看出回调约束对于更复杂的断言是如何有用的。

#3


8  

I ended up creating my own constraint class, based on the attribute one

我最终创建了自己的约束类,基于属性1

cOnstraint= $constraint;
        $this->arrayKey    = $arrayKey;
    }


    /**
     * Evaluates the constraint for parameter $other. Returns TRUE if the
     * constraint is met, FALSE otherwise.
     *
     * @param mixed $other Value or object to evaluate.
     * @return bool
     */
    public function evaluate($other)
    {
        if (!array_key_exists($this->arrayKey, $other)) {
            return false;
        }

        $this->value = $other[$this->arrayKey];

        return $this->constraint->evaluate($other[$this->arrayKey]);
    }

    /**
     * @param   mixed   $other The value passed to evaluate() which failed the
     *                         constraint check.
     * @param   string  $description A string with extra description of what was
     *                               going on while the evaluation failed.
     * @param   boolean $not Flag to indicate negation.
     * @throws  PHPUnit_Framework_ExpectationFailedException
     */
    public function fail($other, $description, $not = FALSE)
    {
        parent::fail($other[$this->arrayKey], $description, $not);
    }


    /**
     * Returns a string representation of the constraint.
     *
     * @return string
     */
    public function toString ()
    {
        return 'the value of key "' . $this->arrayKey . '"(' . $this->value . ') ' .  $this->constraint->toString();
    }


    /**
     * Counts the number of constraint elements.
     *
     * @return integer
     */
    public function count ()
    {
        return count($this->constraint) + 1;
    }


    protected function customFailureDescription ($other, $description, $not)
    {
        return sprintf('Failed asserting that %s.', $this->toString());
    }

It can be used like this:

它可以像这样使用:

 ... ->with(new Test_Constraint_ArrayHas($this->equalTo($value), $key));

#4


2  

In case you wish to do some complex testing on the parameter, and also have useful messages and comparisons, there is always the option of placing assertions within the callback.

如果您希望对参数进行一些复杂的测试,并且还有有用的消息和比较,总是可以选择在回调中放置断言。

e.g.

例如

$clientMock->expects($this->once())->method('post')->with($this->callback(function($input) {
    $this->assertNotEmpty($input['txn_id']);
    unset($input['txn_id']);
    $this->assertEquals($input, array(
        //...
    ));
    return true;
}));

Notice that the callback returns true. Otherwise, it would always fail.

请注意,回调返回true。否则,它总会失败。

#5


-3  

Sorry, I'm not an English speaker.

对不起,我不是说英语的人。

I think that you can test if a key exists in the array with the array_key_exists function, and you can test if the value exists with array_search

我认为您可以使用array_key_exists函数测试数组中是否存在键,并且您可以使用array_search测试该值是否存在

For example:

例如:

function checkKeyAndValueExists($key,$value,$arr){
    return array_key_exists($key, $arr) && array_search($value,$arr)!==false;
}

Use !== because array_search return the key of that value if exists and it may be 0.

使用!==因为如果存在,array_search将返回该值的键,它可能为0。


推荐阅读
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文将继续探讨前端开发中常见的算法问题,重点介绍如何将多维数组转换为一维数组以及验证字符串中的括号是否成对出现。通过多种实现方法的解析,帮助开发者更好地理解和掌握这些技巧。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 本文详细解析了 offset、client 和 page 坐标系统的不同之处。offset 是相对于当前元素的边界框的距离,与滚动条无关;client 是相对于可视区域(viewport)的距离,也与滚动条无关;page 则是相对于整个文档的距离,受滚动条位置影响。 ... [详细]
  • 深入探讨Web页面中的锚点交互设计
    本文旨在分享Web前端开发中关于网页锚点效果的实现与优化技巧。随着Web技术的发展,越来越多的企业开始重视前端开发的质量和用户体验,而锚点功能作为提升用户浏览体验的重要手段之一,值得深入研究。 ... [详细]
  • 深入理解 JMeter 定时器
    本文详细介绍了JMeter中定时器的功能和使用方法,探讨了其在性能测试中的重要性,并结合实际案例解释了如何合理配置定时器以模拟真实的用户行为。文章还涵盖了定时器的执行顺序及其与其他元件的相互作用。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
  • 探讨在使用 Fast-Android-Networking 库时遇到的 addStringBody 方法无法正常工作的问题及其解决方案。 ... [详细]
author-avatar
布瓜Pourqu2502854853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有