PHPUnit中的嵌套数组键值断言

Posted

技术标签:

【中文标题】PHPUnit中的嵌套数组键值断言【英文标题】:Nested array key value assertion in PHPUnit 【发布时间】:2020-10-26 21:43:08 【问题描述】:

我试图断言我的嵌套数组的特定键包含给定值。 例如: 我有这个:

$owners=[12,15];

这是我从服务器获得的 API 响应密钥:

$response=[
          'name'=>'Test',
          'type_id'=>2,
          'owners'=>[
                    [
                     'resource_id'=>132,
                     'name'=>'Jonathan'
                    ],
                    [
                     'resource_id'=>25,
                     'name'=>'Yosh'
                    ]
                   ]
          ];

我想检查我的所有者数组中的至少一个是否应该将 resource_id 设为 132。我觉得 phpUnit assertArraySubset 中有一个断言,但它可能已被弃用。

谁能告诉我如何将键与嵌套数组中的特定值匹配? 我在 PHPUnit 框架中看不到任何方法。

PS。抱歉,代码格式不正确,我不知道如何在 SO 上正确使用它。 谢谢

【问题讨论】:

【参考方案1】:

编写自己的约束以保持测试的可读性通常是个好主意。尤其是在这种情况下,当您有嵌套结构时。如果您只在一个测试类中需要它,您可以将约束设为匿名类,由具有有意义名称的辅助方法返回。

public function test()

    $response = $this->callYourApi();

    self::assertThat($response, $this->hasOwnerWithResourceId(132));


private function hasOwnerWithResourceId(int $resourceId): Constraint

    return new class($resourceId) extends Constraint 
        private $resourceId;

        public function __construct(int $resourceId)
        
            parent::__construct();

            $this->resourceId = $resourceId;
        

        protected function matches($other): bool
        
            foreach ($other['owners'] as $owner) 
                if ($owner['resource_id'] === $this->resourceId) 
                    return true;
                
            

            return false;
        

        public function toString(): string
        
            return sprintf('has owner with resource id "%s"', $this->resourceId);
        
    ;

【讨论】:

以上是关于PHPUnit中的嵌套数组键值断言的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit 断言抛出异常?

使用模型的 Casts 数组来验证 PHPUnit 上的模型完整性

PHPUnit 方法调用期望与断言

PHPUnit 问题断言模拟是使用 Laravel 的 ReflectionProperty 对象

PHPUnit 断言没有调用任何方法

PHPUnit:assertThat()是否增加断言计数?