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

vidhyaprakash85's avatar

pest php edit route with relationship test

I am using pest php framework for testing. I have edit route with relationships, I don't know how to send to route in testing.

test('super superadmin can able to update user', function () {
    $this->withoutExceptionHandling();
    $levels = Level::select('id', 'name')->get();
    $departments = Department::select('id', 'name')->get();
    $genders = Gender::select('id', 'name')->get();
    $branches = Branch::select('id', 'name')->get();
    $studentstatues = StudentStatus::select('id', 'name')->get();
    $user = User::find(1);
    $response = $this->get(route('user.edit', $user->id, [
        'levels' => $levels,
        'department' => $departments,
        'genders' => $genders,
        'branches' => $branches,
        'studentstatues' => $studentstatues,
        'user' => $user
    ]));
    $response->assertStatus(200);
    $data = [
        'username' => 'Test',
        ...
    ];
    $response = $this->put(route('user.update', $user->id), $data);
    $this->assertDatabaseHas('users', $data);
    $response->assertStatus(302);
    $response->assertRedirectToRoute('user.index');
});

But I am getting this error

Attempt to read property "id" on null (View: /Users/xxx/xxx-xxxx/resources/views/superadmin/mastertables/user/edit.blade.php)

gender->id

0 likes
3 replies
tisuchi's avatar
tisuchi
Best Answer
Level 70

@vidhyaprakash85 Try this:


test('super admin can update user', function () {
    // Arrange: Create necessary instances
    $user = User::factory()->create();
    $gender = Gender::factory()->create();
    // other related models...

    // Act: Visit the edit route and attempt to update the user
    $response = $this->get(route('user.edit', $user->id));
    $response->assertStatus(200);

    $updateData = [
        'username' => 'Test', 
        'gender_id' => $gender->id, 
        /* other fields */
    ];
    $response = $this->put(route('user.update', $user->id), $updateData);

    // Assert: Check database and response
    $this->assertDatabaseHas('users', $updateData);
    $response->assertStatus(302);
    $response->assertRedirect(route('user.index'));
});

3 likes
vidhyaprakash85's avatar

@tisuchi i am using seeder in the code

beforeEach(function () {
    app(DatabaseSeeder::class)->call(RoleSeeder::class);
    app(DatabaseSeeder::class)->call(PermissionSeeder::class);
    app(DatabaseSeeder::class)->call(GenderSeeder::class);
    app(DatabaseSeeder::class)->call(LevelSeeder::class);
    app(DatabaseSeeder::class)->call(DepartmentSeeder::class);
    app(DatabaseSeeder::class)->call(BranchSeeder::class);
    app(DatabaseSeeder::class)->call(StudentStatusSeeder::class);
    $user = User::factory()->create();
    $role = Role::findById(1);
    $user->assignRole($role);
    $this->actingAs($user);
});

is this correct ?

2 likes

Please or to participate in this conversation.