2012-01-28 51 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; 
} 
相關問題