2012-01-28 80 views
1

假设我们有以下的阵列,$myArray,检查按var_export:如果此数组包含AnObject其中有'bar'名称PHPUnit:如何检查一个数组是否有一个具有特定属性的对象?

array (
    0 => AnObject::__set_state(array(
      'id' => 10, 
      'name' => 'foo' 
)), 
    1 => AnObject::__set_state(array(
      'id' => 23, 
      'name' => 'bar' 
)), 
    2 => AnObject::__set_state(array(
      'id' => 55, 
      'name' => 'baz' 
)), 
) 

断言应该通过。

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

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

是否有包含检查整个数组并返回的真实某种方式使用$this->assertThat(),或其他类型其中一个对象具有匹配的属性?

回答

3

没有这样的内置断言,我想不出有什么可能将它们结合起来以获得预期的结果。

我推荐你 - 是创建一个辅助方法,它接受一个数组并在循环中进行必要的检查。

其他解决方法就是为这种情况下创建全新的断言,但我认为这是这个任务;-)

+1

要看,如果你需要更经常检查或实际的比较也越来越多,越来越复杂:一个自己的说法是不是很难整合。只是说。 – hakre 2012-01-30 15:23:32

+0

@hakre:只要同意:-) – zerkms 2012-01-30 19:29:50

1

扩大对zerkms提供的答案矫枉过正,下面是我是如何处理这个确切的任务:

PHPUnit_Framework_Assert::assertTrue($this->assertArrayContainsSameObject($yourArray, $theObjectToCheck)); 

要检查的阵列包含具有相同的属性和值的对象(即,不一定引用相同的实例):

private function assertArrayContainsSameObject($theArray, $theObject) 
{ 
    foreach($theArray as $arrayItem) { 
     if($arrayItem == $theObject) { 
      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; 
} 
相关问题