Утверждение списков (т. е. неассоциативных массивов) в тестах: HTTP-тесты PHPUnit и Laravel без учета порядка элементовPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Утверждение списков (т. е. неассоциативных массивов) в тестах: HTTP-тесты PHPUnit и Laravel без учета порядка элементов

Сообщение Anonymous »

Как вы знаете, когда в PHPUnit мы используем AssertEquals() и AssertSame() и передаем им массивы, они будут утверждать массивы на основе пар ключ-значение. Поэтому, если массив не является ассоциированным массивом (списком) и порядок не имеет значения, тесты завершится неудачей. Поскольку эти методы рассматривают индекс как ключ и сравнивают значение для каждого соответствующего ключа.
Эту проблему можно легко решить с помощью специального метода утверждения, например:

Код: Выделить всё

protected function assertListWithoutOrderEquals(array $expected, array $actual): void
{
sort($expected);
sort($actual);

$this->assertEquals($expected, $actual);
}
Но когда мы находимся в HTTP-тестировании Laravel и у нас есть json для утверждения, Laravel преобразует json в массив и утверждает их на основе этих методов, я думаю, и у меня нет никаких идея исправить эту проблему здесь.
Например, у меня есть этот тест в Laravel, и у меня проблема с определением значения жанров.:

Код: Выделить всё

use Illuminate\Testing\Fluent\AssertableJson;

public function test_http_response(): void
{
$expectedData = [
'id' => 1,
'name' => 'The fantastic book',
'genres' => ['science-fiction', 'drama', 'mystery'],
// other elements
];

$response = $this->get('url');

$response->assertJson(
fn(AssertableJson $json) => $json->where('id', $expectedData['id'])
->where('name', $expectedData['name'])
->where('genres', $expectedData['genres']) // This is order sensitive and makes tests to fail.
->etc()
);
}
Я пробовал это, но это грязно. Я ищу лучшее и более чистое решение, если вы можете мне помочь.

Код: Выделить всё

->where('genres', fn($genres) => $genres->diff($expectedData['genres'])->isEmpty() && $genres->count() == count($expectedData['genres']))
Чтобы лучше объяснить, Laravel преобразует массив json в коллекцию, поэтому я проверил diff(), и поскольку diff() — односторонний метод, я имею в виду, что он проверяет все элементы в первом массиве существуют во втором массиве и не учитывают лишние элементы во втором массиве, я также проверил их размер.

Подробнее здесь: https://stackoverflow.com/questions/791 ... aravel-htt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»