PHPUnit:如何检查数组是否具有具有特定属性的对象?

PHPUnit:如何检查数组是否具有具有特定属性的对象?,phpunit,Phpunit,假设我们有以下数组,$myArray,要根据var\u导出进行检查: 数组( 0=>AnObject::\u设置\u状态(数组)( “id”=>10, 'name'=>'foo' )), 1=>AnObject::\u设置\u状态(数组)( “id”=>23, 'name'=>'bar' )), 2=>AnObject::\u设置\u状态(数组)( “id”=>55, 'name'=>'baz' )), ) 如果此数组包含一个名为'bar'的对象,则断言应通过 我知道如果我知道AnObject

假设我们有以下数组,
$myArray
,要根据var\u导出进行检查:

数组(
0=>AnObject::\u设置\u状态(数组)(
“id”=>10,
'name'=>'foo'
)),
1=>AnObject::\u设置\u状态(数组)(
“id”=>23,
'name'=>'bar'
)),
2=>AnObject::\u设置\u状态(数组)(
“id”=>55,
'name'=>'baz'
)),
)
如果此数组包含一个名为
'bar'
对象,则断言应通过

我知道如果我知道
AnObject
值的位置,我可以使用:

$this->assertAttributeSame('bar','name',$myArray[1]);

是否有某种方法可以使用
$this->assertThat()
,或其他类型的contains来检查整个数组,并返回其中一个具有匹配属性的对象的true?

没有这种内置断言,我想不出任何可能将它们组合起来以获得预期结果

我建议您创建一个helper方法,该方法接受数组并在循环中执行必要的检查


另一种解决方案是仅为这种情况创建全新的断言,但我认为这对于这项任务来说是一种过分的做法;-)

在虫族提供的答案的基础上,下面是我如何完成这项任务的:

PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObject($yourArray, $theObjectToCheck));
要检查数组是否包含具有相同属性和值的对象(即不一定引用同一实例),请执行以下操作:

要检查相同的引用,只需将
==
更改为
==

要解决原始海报的问题:

PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObjectWithValue($yourArray, 'name', 'bar'));


private function assertArrayContainsSameObjectWithValue($theArray, $attribute, $value)
{
    foreach($theArray as $arrayItem) {
        if($arrayItem->$attribute == $value) {
            return true;
        }
    }
    return false;
}

这取决于,如果您需要更频繁地进行检查,或者实际的比较变得越来越复杂:一个自己的断言并不难集成。只是说说而已。
PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObjectWithValue($yourArray, 'name', 'bar'));


private function assertArrayContainsSameObjectWithValue($theArray, $attribute, $value)
{
    foreach($theArray as $arrayItem) {
        if($arrayItem->$attribute == $value) {
            return true;
        }
    }
    return false;
}