Laravel特性测试:工厂记录存在,但测试表明不存在



我的Laravel功能测试遇到了一个奇怪的问题。我有一个createTeam方法,它创建一个工厂记录并将其持久化到内存数据库中。

    public function createTeam(): static
    {
        $this->team = Team::factory()->create([
            'name' => $this->user->name . ' Team',
        ]);
        $this->team->assignMember($this->user, TeamRoleTypes::OWNER);
        return $this;
    }

然后我继续尝试测试一个动作。

    public function testUserCanDeleteItsOwnTeam()
    {
        $this->createTeam();
        $this
            ->useToken()
            ->deleteJson(route('team.delete', ['team' => $this->team->id]), [
                'name' => 'Second team',
            ])
            ->assertOk();
    }

然而,回复说"No query results for model [AppModelsTeam] e99a7514-58e2-4d29-91f2-f0c3a034a419"。当我用Team::find("e99a7514-58e2-4d29-91f2-f0c3a034a419")之类的东西在同一个测试中检查同一个模型是否存在时,它说它就在那里!

有人知道为什么会发生这种事吗?

事实证明,问题出在工厂和Laravel/PHPUnit/Memory DB的神秘行为上。。。发生的情况是由自动生成的工厂类试图手动填充时间戳字段引起的,如下所示:

class TeamFactory extends Factory
{
    protected $model = Team::class;
    public function definition(): array
    {
        return [
            'id' => Str::uuid(),
            'name' => $this->faker->name(),
            'deleted_at' => Carbon::now(),
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),
        ];
    }
}

最后三个定义是导致癌症的原因,现在删除这些小错误后,一切都如预期一样。

相关内容

  • 没有找到相关文章

最新更新