我的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(),
];
}
}
最后三个定义是导致癌症的原因,现在删除这些小错误后,一切都如预期一样。