Почему метод toArray () Collection не конвертирует вложенные объекты в массивы при вызове в тесте PHPUnit? - PullRequest
2 голосов
/ 08 марта 2020

Ожидаемое поведение:

Коллекции Метод toArray () должен преобразовать коллекцию в обычный array и все вложенные объекты коллекции, которые являются экземпляром Arrayable, в массив.

Фактическое поведение:

toArray() метод преобразует коллекцию в обычный array, но вложенные объекты не преобразуются. Обратите внимание, что такое поведение наблюдается только тогда, когда toArray() вызывается через PHPUnit. Когда toArray() функция вызывается из приложения или через Laravel Tinker, она работает как положено.

Шаги для воспроизведения:

Репозиторий с ошибочным тестом Тест

Клонирование, установка пакетов, запуск PHPUnit.

<?php

namespace Tests\Unit;

use App\User;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class CollectionToArrayTest extends TestCase
{
    use RefreshDatabase;

    /** @test */
    public function it_converts_nested_objects_that_are_an_instance_of_arrayable_to_an_array()
    {
        factory(User::class)->create();

        $users = User::get();

        // passed
        $this->assertInstanceOf(Arrayable::class, $users[0]);

        // Failed asserting that App\User Object is of type "array"
        $this->assertIsArray($users->toArray()[0]);

        // passed
        $this->assertIsArray($users->toArray()[0]->toArray());
    }
}

Наблюдения:

  1. Это работало раньше, вероятно, с предыдущими версиями PHP и PHPUnit, однако я не смог определить момент, когда он остановился.

  2. Кажется, что EnumeratesValues ​​:: toArray () не вызывается, когда ->toArray() вызывается для Collection в предоставленном тесте PHPUnit.

Laravel Версия: 7.0.7 PHP Версия: 7.3.15 Версия PHPUnit: 8.5.2

1 Ответ

0 голосов
/ 10 марта 2020

Устранена проблема.

У меня Laravel Valet и PHPUnit установлены глобально. Valet требует пакета tightenco/collect, который находится в конфликте с Laravel Collections.

При запуске PHPUnit, \Illuminate\Support\Collection заменяется на Tightenco\Collect\Support\Collection, который работает по-другому.

Итак, я ' мы удалили глобальный PHPUnit и использовали вместо него локальную версию.

Я создал проблему GitHub

...