TIL | Laravel 8 Testing Redirect Back Assertation

Today I Learned series

Syofyan Zuhad
2 min readNov 1, 2021
source: google.com

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

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 routenya 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.

--

--