首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PHPStan会发现这些错误?

为什么PHPStan会发现这些错误?
EN

Stack Overflow用户
提问于 2022-05-07 12:25:41
回答 1查看 648关注 0票数 0

我使用LARAVEL 9和PHPSTAN

我有一个简单的测试方法:

代码语言:javascript
复制
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时,会出现以下错误:

代码语言:javascript
复制
     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的这段代码会有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2022-05-08 10:05:56

首先,不要为单元测试运行PHPStanPHPStan是检查类型完整性和它可以提供的其他静态分析。它们在单元测试中没有意义。

第二,你的工厂电话打错了。如果没有提供计数,create()只创建一个模型,其返回方式如下。如果计数大于1,则返回集合。

代码语言:javascript
复制
User::factory()->create([
        'status' => $status,
        'is_admin' => $isAdmin
    ])

然后调用first()时,它会在单个用户查询生成器上调用它。返回Model或null。

这个问题与键入提示有关,也是PHPStan检查的内容,因为Authenticatable需要一个用户类。PHPStan唯一知道的是,第一个调用返回一个模型或null。这不是严格的类型,因此它抱怨。正如Matias所指出的,所有问题都是通过强制使用类型提示来解决的,这在Laravel的许多更通用的函数中都是必需的。

代码语言:javascript
复制
/** @var User $user */
$user = User::factory()->create([
    'status' => $status,
    'is_admin' => $isAdmin
]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72152474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档