为什么在 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());
}
}
观察:
它以前工作过,可能是以前版本的 PHP 和 PHPUnit,但是我无法确定它停止的那一刻。
在提供的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
预期行为:
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());
}
}
观察:
它以前工作过,可能是以前版本的 PHP 和 PHPUnit,但是我无法确定它停止的那一刻。
在提供的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