为什么在 PHPUnit 测试中调用 Collection 的 toArray() 方法不会将嵌套对象转换为数组?

Why Collection's toArray() method does not convert nested objects to arrays when called in a PHPUnit test?

预期行为:

Collections toArray() 方法应将集合转换为普通 array 并将作为 Arrayable 实例的集合的所有嵌套对象转换为数组。

实际行为:

toArray() 方法将集合转换为普通 array 但不转换嵌套对象。 请注意,仅当 toArray() 通过 PHPUnit 调用时才会观察到此行为。当 toArray() 函数在应用程序内或通过 Laravel Tinker 调用时,它会按预期工作。

重现步骤:

Repository with a failing test
Test

克隆,安装包,运行 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. 在提供的PHP单元测试中,当->toArray()被调用时,EnumeratesValues::toArray()似乎没有被调用。

Laravel版本:7.0.7
PHP版本:7.3.15
PHP单元版本:8.5.2

问题已解决。

我在全球安装了 Laravel Valet 和 PHPUnit。 Valet 需要 tightenco/collect 个与 Laravel 个集合冲突的包。

当 运行 PHPUnit 时,\Illuminate\Support\Collection 被替换为 Tightenco\Collect\Support\Collection,其工作方式不同。

所以,我删除了全局 PHPUnit 并改用本地版本。

我创建了一个GitHub issue