Testing dengan Client Lokal
Penjelasan
Rocket menyediakan `rocket::local::blocking::Client` (untuk test sinkron) dan versi `asynchronous::Client` (untuk test async) yang memungkinkan kamu menguji route TANPA membuka port jaringan sungguhan — mirip tujuan `tower::ServiceExt::oneshot` di Axum, meskipun API-nya berbeda. Alurnya: buat instance Rocket lewat fungsi yang sama dipakai `#[launch]` (biasanya dipisah jadi fungsi `fn rocket() -> Rocket<Build>` yang bisa dipanggil ulang), lalu bungkus dengan `Client::tracked(rocket_instance).expect(...)`. Dari client ini kamu bisa memanggil `.get(path)`, `.post(path).body(...)`, dan seterusnya, lalu memanggil `.dispatch()` untuk mendapatkan response yang bisa diperiksa status dan body-nya. Versi `blocking::Client` cocok untuk kebanyakan test karena API-nya sinkron (tidak perlu `.await` di setiap baris), meskipun Rocket sendiri berjalan di atas runtime async di baliknya — Rocket menangani jembatan blocking-ke-async ini secara otomatis khusus untuk keperluan testing.
Contoh Konsep
#[macro_use] extern crate rocket;
#[get("/")]
fn hello() -> &'static str {
"Hello, Rocket!"
}
fn build_rocket() -> rocket::Rocket<rocket::Build> {
rocket::build().mount("/", routes![hello])
}
#[launch]
fn rocket() -> _ {
build_rocket()
}
#[cfg(test)]
mod tests {
use super::*;
use rocket::local::blocking::Client;
use rocket::http::Status;
#[test]
fn hello_mengembalikan_200() {
let client = Client::tracked(build_rocket()).expect("client valid");
let response = client.get("/").dispatch();
assert_eq!(response.status(), Status::Ok);
assert_eq!(response.into_string().unwrap(), "Hello, Rocket!");
}
}
Praktikum
Lengkapi test di bawah supaya memverifikasi path "/notfound" (yang tidak didaftarkan) mengembalikan status 404.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
`Client::tracked(...)` (dibanding `Client::untracked(...)`) menyimpan cookie antar request dalam client yang sama — berguna kalau kamu menguji alur yang butuh session/cookie, misalnya login lalu mengakses endpoint yang butuh autentikasi, dalam rangkaian test yang sama.