TIL | Laravel 8 Testing Redirect Back Assertation
Today I Learned series
Ok, kita lanjut serial TIL nya. Kali ini yang akan kita bahas masih seputar testing. Jadi jika kita melakukan testing, pasti ada yang namanya action
(aksi) dan reaction
(reaksi). Teorinya ini saya buat sendiri ya, biar lebih mudah dipahami.
Sederhananya setiap aksi yang dilakukan, akan dicek apakah reaksi atau respon dari programnya sudah berjalan sesuai dengan apa yang kita inginkan atau belum.
Contoh
// Ini adalah contoh testing yang sukses (positif)
public function test_login_with_valid_credentials()
{
$response = $this->post('/login', [
'email' => 'admin@gmail.com',
'password => 'password_benar',
]); $response->assertStatus(200);
$response->assertRedirect(route('admin.dashboard'));
}// Ini adalah contoh testing yang gagal (negatif)
public function test_login_with_invalid_credentials()
{
$response = $this->post('/login', [
'email' => 'admin@gmail.com',
'password => 'password_salah',
]); $response->assertStatus(400);
/* disini biasanya akan dikembalikan ke route asal menggunakan
* return redirect()->back();
*/ $response->assertRedirect(route('login'));
}
Jika kita menggunakan assertation seperti diatas maka akan terjadi error.
#Error
#Penyebab
Ini terjadi karena saat kita mengirim request
ke salah satu route
, kita sebelumnya tidak mengunjungi satupun route
,tapi langsung mengirim request
. Karena itulah ketika di-redirect (baca: alihkan) akan kembali ke route
utama yaitu '/'
(slash).
#SOLUSI
Untuk bisa mengecek apakah redirectnya sudah sesuai dengan apa yang kita inginkan, maka ada dua cara untuk mengatasinya.
Pertama
Kita bisa menuliskannya seperti biasa, tanpa kata apapun '/'
seperti ini:
$response->assertRedirect('/');
Cara ini benar, jika kita langsung mengirim request
ke satu route
secara langsung.
Kedua
Jika kita ingin mengecek, apakah redirect nya sudah benar atau belum ke route
yang kita inginkan. Kita bisa mengatur route
asalnya terlebih dahulu saat mengirim request
. Caranya seperti ini:
$response = $this->from(route('login.index'))->post(route('login.store'), [
'email' => 'admin@gmail.com',
'password' => 'password_salah',
]);$response->assertSessionHasNoErrors();
$response->assertRedirect(back()->getTargetUrl());
Atau bisa juga menuliskan route
nya secara langsung seperti ini:
$response = $this->from(route('login.index'))->post(route('login.store'), [
'email' => 'admin@gmail.com',
'password' => 'password_salah',
]);$response->assertSessionHasNoErrors();
$response->assertRedirect(route('login.index'));
Sekian. Semoga bermanfaat.