Menguji Artikel Publik dan Draft dengan Feature Test Laravel
Pastikan artikel terbit bisa dibaca dan draft tetap tidak dapat diakses melalui URL detail.
Menyembunyikan draft dari halaman daftar belum cukup. Pengunjung mungkin mengetahui URL detail dan membukanya langsung. Feature test sebaiknya memeriksa perilaku tersebut melalui permintaan HTTP.
Contoh mengasumsikan route /articles/{post:slug}, model Post dengan factory, serta kolom published_at. Sesuaikan path dengan aplikasi Anda. Gunakan database pengujian terpisah; RefreshDatabase tidak boleh dijalankan terhadap database produksi.
Contoh implementasi
// Public controller action:
public function show(\App\Models\Post $post)
{
abort_unless(
$post->published_at !== null && $post->published_at->lte(now()),
404
);
return view('articles.show', compact('post'));
}
namespace Tests\Feature;
use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ArticleVisibilityTest extends TestCase
{
use RefreshDatabase;
public function test_only_published_articles_are_public(): void
{
$published = Post::factory()->create(['published_at' => now()->subMinute()]);
$draft = Post::factory()->create(['published_at' => null]);
$scheduled = Post::factory()->create(['published_at' => now()->addDay()]);
$this->get('/articles/'.$published->slug)->assertOk();
$this->get('/articles/'.$draft->slug)->assertNotFound();
$this->get('/articles/'.$scheduled->slug)->assertNotFound();
}
}
Cara memeriksa
Tambahkan cast datetime untuk published_at pada model, lalu jalankan php artisan test --filter=ArticleVisibilityTest. Artikel terbit harus menghasilkan HTTP 200; draft dan jadwal masa depan menghasilkan 404.
Factory harus mengisi seluruh kolom wajib dan menghasilkan slug unik. Jika model memicu job atau integrasi eksternal saat disimpan, isolasi efek tersebut dalam pengujian. Sebagai latihan, tambahkan pengujian halaman daftar untuk memastikan draft tidak muncul di sana juga. Pengujian detail dan daftar melindungi jalur akses yang berbeda.
