Как проверить, что массив содержит только объекты с помощью PHPUnit?

Я ищу решение для тестирования массива объектов с помощью PHPUnit в моем проекте Laravel.

Это мой массив стога сена:

[
    [
        "id" => 10,
        "name" => "Ten"
    ],
    [
        "id" => 5,
        "name" => "Five"
    ]
]

А это массив игл:

[
    [
        "id" => 5,
        "name" => "Five"
    ],
    [
        "id" => 10,
        "name" => "Ten"
    ]
]

Порядок объектов не имеет значения, также не имеют значения ключи объектов. Дело только в том, что у нас есть два объекта, и все объекты имеют одинаковые ключи и одинаковые значения.

Какое правильное решение для этого?

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


1
19
2

Ответы:

Решено

Вы можете сделать это, используя метод assertContainsEquals следующим образом:

$haystack = [
    [
        'id' => 10,
        'name' => 'Ten'
    ],
    [
        'id' => 5,
        'name' => 'Five'
    ]
];

$needles = [
    [
        'name' => 'Five',
        'id' => 5
    ],
    [
        'id' => 10,
        'name' => 'Ten'
    ]
];

foreach ($needles as $needle) {
    $this->assertContainsEquals($needle, $haystack);
}

Вы также можете создать свой собственный метод утверждения, если вы собираетесь выполнять утверждение чаще:

public function assertContainsEqualsAll(array $needles, array $haystack): void
{
    foreach ($needles as $needle) {
        $this->assertContainsEquals($needle, $haystack);
    }
}

Основываясь на ответе @Рой Врумен, я реализовал это решение для утверждения точного совпадения:

    public function assertArrayContainsEqualsOnly(array $needles, array $haystack, string $context = ''): void
    {
        foreach ($needles as $index => $needle) {
            $this->assertContainsEquals(
                $needle,
                $haystack,
                ($context ? $context . ': ' : '') . 'Object not found in array.'
            );

            unset($haystack[$index]);
        }

        $this->assertEmpty(
            $haystack,
            ($context ? $context . ': ' : '') . 'Not exact match objects in array.'
        );
    }