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

2022-08-30 12:25:37

给定以下类:

<?php
class Example {
    private $Other;

    public function __construct ($Other)
    {
        $this->Other = $Other;
    }

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

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

这个测试用例:

<?php
require_once 'Example.php';
require_once 'PHPUnit/Framework.php';

class ExampleTest extends PHPUnit_Framework_TestCase {

    public function test_query_key1_value ()
    {   
        $Mock = $this->getMock('Other', array('post'));

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

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

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

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

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

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

我甚至可以将这两者与.但这当然不会给出预期的结果。$this->logicalAnd

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


答案 1

该方法存在,但其名称为:$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

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

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

回调约束期望在其构造函数中具有可调用性,并且只是在评估期间调用它。断言通过或失败取决于可调用的返回是 true 还是 false。

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


推荐