Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

vincent15000's avatar

Strange test results with Pest

Hello,

Hmmm ... I have something strange with Pest.

I specify that I don't use Pest for a long time.

When I run the tests, the same tests alternatively fail or succeed.

Sure I have something wrong in my tests.

pest()
    ->extend(TestCase::class)
    ->use(FastRefreshDatabase::class)
    ->in('Feature');

function asSuperadmin(): TestCase
{
    $user = Event::fakeFor(function () {
        $user = User::factory()->superadmin()->create();

        return $user;
    });

    return test()->actingAs($user);
}

And the test.

test('superadmin can access create page', function () {
    asSuperadmin()->get(route('users.create'))->assertOk();
});

What's the problem ?

Thanks for your help.

V

0 likes
5 replies
Tray2's avatar

What does the the route, controller, and view look like?

1 like
vincent15000's avatar

@Tray2

The route

Route::middleware(['auth', 'verified'])->group(function () {
	...
    Route::middleware('not-banned')->group(function () {
        ...
		Route::middleware('business')->group(function () {
			...
            Route::resource('users', UserController::class);
        });
    });
});

The controller

public function create()
{
    Gate::authorize('create', User::class);

    $user = new User;

    if (auth()->user()->isSuperadmin()) {
        $roles = Arr::map(RoleEnum::superadminRoles(), function ($role) {
            return [
                'value' => $role->value,
                'label' => $role->label(),
            ];
        });
    } else {
        $roles = Arr::map(RoleEnum::organizationRoles(), function ($role) {
            return [
                'value' => $role->value,
                'label' => $role->label(),
            ];
        });
    }

    return view('users.create', compact('user', 'roles'));
}

The policy

public function create(User $user): bool
{
    return $user->isManager();
}

The model

public function isManager(): bool
{
    return in_array(RoleEnum::MANAGER->value, $this->roles ?? []);
}

The view

Glukinho's avatar
User::factory()->superadmin()->create()

What does ->superadmin() do?

1 like
vincent15000's avatar

@Glukinho

public function superadmin(): static
{
    return $this->state(fn (array $attributes) => [
        'roles' => [RoleEnum::SUPERADMIN, RoleEnum::ADMIN, RoleEnum::MANAGER, RoleEnum::ASSISTANT, RoleEnum::FOREMAN],
    ]);
}
vincent15000's avatar

@tray2 @glukinho

The issue was due to the use of Event::fake().

Once I removed it, the system started working as expected.

Now there is another question : why did this fake event generate the issue ?

Please or to participate in this conversation.