PHPUnit: Как проверить, что массив имеет объект с определенным атрибутом? - PullRequest
1 голос
/ 28 января 2012

Допустим, у нас есть следующий массив $myArray для проверки согласно var_export:

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() или другой тип содержимого дляпроверить весь массив и вернуть true, если один из объектов имеет соответствующий атрибут?

Ответы [ 2 ]

3 голосов
/ 28 января 2012

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

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

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

1 голос
/ 10 сентября 2015

Расширяя ответ, предоставленный 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...