Build test objects fluently with a Builder pattern: withName(), asAdmin(), withAge(), build().
Test Builder
class UserBuilder {
private array $attrs = [
"name"=>"Alice","email"=>"a@b.com","age"=>28,"role"=>"user"
];
public function withName(string $name): static {
$c = clone $this; $c->attrs["name"]=$name; return $c;
}
public function asAdmin(): static {
$c = clone $this; $c->attrs["role"]="admin"; return $c;
}
public function build(): User {
return new User(...$this->attrs);
}
}
$admin = (new UserBuilder)->asAdmin()->withName("Bob")->build();