Я ищу решение для тестирования массива объектов с помощью PHPUnit в моем проекте Laravel.
Это мой массив стога сена:
[
[
"id" => 10,
"name" => "Ten"
],
[
"id" => 5,
"name" => "Five"
]
]
А это массив игл:
[
[
"id" => 5,
"name" => "Five"
],
[
"id" => 10,
"name" => "Ten"
]
]
Порядок объектов не имеет значения, также не имеют значения ключи объектов. Дело только в том, что у нас есть два объекта, и все объекты имеют одинаковые ключи и одинаковые значения.
Какое правильное решение для этого?
🤔 А знаете ли вы, что...
Laravel предоставляет инструменты для многопользовательских приложений и ролевой системы.
Вы можете сделать это, используя метод 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.'
);
}