我使用LARAVEL 9和PHPSTAN
我有一个简单的测试方法:
public function createAndAuthenticatedAnUser(string $status = 'VALIDATED', bool $isAdmin = false): User
{
$user = User::factory()->create([
'status' => $status,
'is_admin' => $isAdmin
])->first();
$this->actingAs($user);
return $user;
}当我运行PHPSTAN时,会出现以下错误:
40 Parameter #1 $user of method Illuminate\Foundation\Testing\TestCase::actingAs() expects
Illuminate\Contracts\Auth\Authenticatable, Illuminate\Database\Eloquent\Model|null given.
41 Method Tests\Feature\ValidateRegistrationTest::createAndAuthenticatedAnUser() should return App\Models\User
but returns Illuminate\Database\Eloquent\Model|null.对于第一个错误:操作--正如所期望的用户所期望的那样,情况就是这样。
对于第二个错误:函数返回一个用户(它扩展了Authenticatable) )
PHPSTAN的这段代码会有什么问题?
发布于 2022-05-08 10:05:56
首先,不要为单元测试运行PHPStan,PHPStan是检查类型完整性和它可以提供的其他静态分析。它们在单元测试中没有意义。
第二,你的工厂电话打错了。如果没有提供计数,create()只创建一个模型,其返回方式如下。如果计数大于1,则返回集合。
User::factory()->create([
'status' => $status,
'is_admin' => $isAdmin
])然后调用first()时,它会在单个用户查询生成器上调用它。返回Model或null。
这个问题与键入提示有关,也是PHPStan检查的内容,因为Authenticatable需要一个用户类。PHPStan唯一知道的是,第一个调用返回一个模型或null。这不是严格的类型,因此它抱怨。正如Matias所指出的,所有问题都是通过强制使用类型提示来解决的,这在Laravel的许多更通用的函数中都是必需的。
/** @var User $user */
$user = User::factory()->create([
'status' => $status,
'is_admin' => $isAdmin
]);https://stackoverflow.com/questions/72152474
复制相似问题