2012-01-28 2 views
1

Скажем, у нас есть следующий массив, $myArray, чтобы проверить, как на var_export: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, который имеет название 'bar'.

Я знаю, что если бы я знал позицию значения AnObject, я мог бы использовать:

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

Есть ли какой-то способ использовать $this->assertThat(), или другой тип содержит проверить весь массив и возвращает истину в у одного из объектов есть атрибут, который соответствует?

ответ

3

Нет такого встроенного утверждения, и я не могу придумать никакой возможности объединить их для получения ожидаемого результата.

Что я рекомендую вам - это создать вспомогательный метод, который принимает массив и выполняет необходимую проверку в цикле.

Другое решение создать совершенно новое утверждение как раз для этого случая, но я думаю, что это слишком для этой задачи ;-)

+1

Зависит, если вам нужно, чтобы проверить более часто или фактическое сравнение становится все более и более сложным: собственное утверждение не так уж трудно интегрировать. Просто говорю. – hakre

+0

@hakre: Просто соглашаюсь :-) – zerkms

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; 
} 
Смежные вопросы