Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Search
Menu

Cara Menggunakan Closure Atasi Error Model Factories di PHPUnit Laravel

Posted on June 10, 2024

Di Laravel, ada beberapa cara untuk bekerja dengan pabrik model (model factories) dalam pengujian fitur. Misalnya, Anda bisa membuat model di fungsi setUp() jika ingin menggunakannya untuk beberapa pengujian atau langsung membuatnya di tiap kasus pengujian.

Namun, bagaimana jika Anda ingin menguji kasus dengan berbagai macam data? Di sinilah data provider PHPUnit dengan model Eloquent berperan.

Menggunakan data provider pada pengujian fitur bisa jadi merepotkan karena ia dijalankan sebelum Laravel di-bootstrapping melalui class TestCase yang dijalankan selama setUp(). Data provider dieksekusi di awal proses menjalankan phpunit, sehingga Anda akan menemui error berikut jika ingin menggunakannya:

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    #[DataProvider('nonAdminUsers')]
    public function test_non_admin_users_cannot_access_admin($user): void
    {
        $response = $this
            ->actingAs($user())
            ->get('/admin')
            ->assertStatus(403);
    }

    public static function nonAdminUsers(): array
    {
        return [
            [User::factory()->player()->create()],
            [User::factory()->coach()->create()],
            [User::factory()->owner()->create()],
        ];
    }
}

Jika Anda menjalankan pengujian di atas, Anda akan mendapatkan error seperti berikut, tergantung versi Laravel Anda (contoh ini untuk Laravel 11):

$ vendor/bin/phpunit tests/Feature/ExampleTest.php

There was 1 PHPUnit error:

1) Tests\Feature\ExampleTest::test_non_admin_users_cannot_access_admin
The data provider specified for Tests\Feature\ExampleTest::test_non_admin_users_cannot_access_admin is invalid
A facade root has not been set.

tests/Feature/ExampleTest.php:18

Ini terjadi karena ketika kode data provider dijalankan, aplikasi Laravel belum di-bootstrapping!

Solusi Menggunakan Closure

Jika Anda pengguna Pest PHP, contoh “Bound Datasets” menggunakan closure untuk data model:

it('can generate the full name of a user', function (User $user) {
    expect($user->full_name)->toBe("{$user->first_name} {$user->last_name}");
})->with([
    fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']),
    fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']),
    fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']),
]);

Di PHPUnit, kita bisa menggunakan closure untuk mengirimkan kode ke pengujian melalui data provider tanpa langsung mencoba membuat datanya:

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    #[DataProvider('nonAdminUsers')]
    public function test_non_admin_users_cannot_access_admin($user): void
    {
        $response = $this
            ->actingAs($user())
            ->get('/admin')
            ->assertStatus(403);
    }

    public static function nonAdminUsers(): array
    {
        return [
            [fn(): User => User::factory()->player()->create()],
            [fn(): User => User::factory()->coach()->create()],
            [fn(): User => User::factory()->owner()->create()],
        ];
    }
}

Perhatikan pemanggilan $user(), yang kita teruskan ke actingAs(). Jika Anda perlu menggunakan model di berbagai tempat, tetapkan saja ke sebuah variabel. Sekarang, data pabrik dibuat di dalam pengujian, sesuai dengan yang kita inginkan!

Pelajari Lebih Lanjut

Untuk mempelajari lebih lanjut tentang pengujian fitur HTTP di Laravel, cek dokumentasi resminya.

Kesimpulan

Artikel ini menjelaskan bagaimana mengatasi error yang muncul ketika menggunakan data provider PHPUnit dengan pabrik model Eloquent dalam pengujian fitur Laravel. Solusi yang disarankan adalah menggunakan closure untuk menunda pembuatan data pabrik hingga ke dalam pengujian itu sendiri. Ini memastikan bahwa aplikasi

Terbaru

  • Belum Tahu? Inilah Suku Bajau Punya Gen “Mutan” Mirip Fishman One Piece, Ini Faktanya!
  • Inilah Paket PLTS Hybrid 6kVA Aspro DML 600 yang Paling Powerful!
  • Suku Tsaatan: Suku Mongolia Penggembala Rusa Kutub
  • Game Happy Rush Terbukti Membayar atau Cuma Scam Iklan?
  • Cara Nonton Drama Dapat Duit di Free Flick, Tapi Awas Jangan Sampai Tertipu Saldo Jutaan!
  • APK Pinjol Rajindompet Penipu? Ini Review Aslinya
  • Keganggu Iklan Pop-Up Indosat Pas Main Game? Ini Trik Ampuh Matikannya!
  • Belum Tahu? Inilah Cara Upload Reels Instagram Sampai 20 Menit, Konten Jadi Lebih Puas!
  • Apa itu Negara Somaliland? Apa Hubungannya dengan Israel?
  • Apa itu Game TheoTown? Game Simulasi Jadi Diktator
  • Inilah Rekomendasi 4 HP Honor Terbaik – Prosesor Snapdragon Tahun 2026
  • Lagi Nyari HP Gaming Murah? Inilah 4 HP Asus RAM 8 GB yang Recomended
  • Ini Trik Main Game Merge Cats Road Trip Sampai Tarik Saldo ke DANA
  • Mau Jadi Digital Writer Pro? Ini Caranya Buat Portofolio Pakai Blog!
  • Ini Cara Login Banyak Akun FB & IG di Satu HP Tanpa Diblokir!
  • Inilah Cara Mengatasi Verval Siswa Silang Merah di RDM versi Hosting
  • HP Tertinggal? Inilah Caranya Login PDUM Langsung dari Laptop, Lebih Praktis!
  • Inilah Cara Tarik Dana dari APK Drama Rush
  • Inilah Cara Mudah Tarik Uang Kertas Biru di Merge Cats ke DANA dan OVO Tanpa Ribet!
  • Apakah Aplikasi Pinjaman KlikKami Penipu? Ada DC Penagih?
  • Kenapa Tentara Romawi Hanya Pakai Armor Kaki Saja?
  • Inilah Alasan Kenapa Beli Follower IG itu TIDAK AMAN!
  • EPIK! Kisah Mesin Bor Tercanggih Takluk di Proyek Terowongan Zojila Himalaya
  • Bingung Cari Lokasi Seseorang? Cek Cara Melacak Pemilik Nomor HP Tanpa Bayar Ini, Dijamin Akurat!
  • Apa itu Logis? Kenapa Logika Bisa Berbeda-beda?
  • Ini Alasan Kenapa Fitur Bing AI Sedang Trending dan Dicari Banyak Orang
  • Sejarah Kerajaan Champa: Bangsa Yang Hilang Tanpa Perang Besar, Kok Bisa?
  • Gini Caranya Dapat Weekly Diamond Pass Gratis di Event M7 Pesta, Ternyata Nggak Pake Modal!
  • Inilah Trik Rahasia Panen Token dan Skin Gratis di Event Pesta Cuan M7 Mobile Legends!
  • Apakah Apk Pinjaman Cepat Galaxy Pinjol Penipu?
  • Tailwind’s Revenue Down 80%: Is AI Killing Open Source?
  • Building Open Cloud with Apache CloudStack
  • TOP 1% AI Coding: 5 Practical Techniques to Code Like a Pro
  • Why Your Self-Hosted n8n Instance Might Be a Ticking Time Bomb
  • CES 2026: Real Botics Wants to Be Your Best Friend, but at $95k, Are They Worth the Hype?
  • Inilah Cara Belajar Cepat Model Context Protocol (MCP) Lewat 7 Proyek Open Source Terbaik
  • Inilah Cara Menguasai Tracing dan Evaluasi Aplikasi LLM Menggunakan LangSmith
  • Begini Cara Menggabungkan LLM, RAG, dan AI Agent untuk Membuat Sistem Cerdas
  • Cara Buat Sistem Moderasi Konten Cerdas dengan GPT-OSS-Safeguard
  • Inilah Cara Membuat Aplikasi Web Full-Stack Tanpa Coding dengan Manus 1.5
  • Apa itu CVE-2025-14847? Ini Penjelasan Lengkap MongoBleed
  • Ini Kronologi & Resiko Kebocoran Data WIRED
  • Apa itu Grubhub Crypto Scam? Ini Pengertian dan Kronologi Penipuan yang Catut Nama Grubhub
  • Apa Itu CVE-2025-59374? Mengenal Celah Keamanan ASUS Live Update yang Viral Lagi
  • Apa itu RansomHouse Mario? Ini Pengertian dan Mengenal Versi Baru ‘Mario’ yang Makin Bahaya
Beli Morning Star Kursi Gaming/Kantor disini: https://s.shopee.co.id/805iTUOPRV
Beli Pemotong Rumput dengan Baterai IRONHOOF 588V Mesin Potong Rumput 88V disini https://s.shopee.co.id/70DBGTHtuJ

©2026 emka.web.id | Design: Newspaperly WordPress Theme