Метод followingRedirects
Метод followingRedirects применяется к HTTP-клиенту в тестах Laravel и автоматически обрабатывает все редиректы, возвращаемые приложением. Он возвращает экземпляр TestResponse с финальным ответом после прохождения всей цепочки перенаправлений. Метод полезен при тестировании маршрутов, которые выполняют редирект, позволяя проверить конечную страницу или данные без ручного перехода по каждому редиректу.
Синтаксис
<?php
$this->followingRedirects()->get($uri, $headers);
$this->followingRedirects()->post($uri, $data, $headers);
$this->followingRedirects()->put($uri, $data, $headers);
$this->followingRedirects()->delete($uri, $headers);
?>
Пример
Давайте протестируем маршрут, который выполняет редирект после создания записи:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ArticleControllerTest extends TestCase
{
use RefreshDatabase;
public function test_store_redirects_to_article_show()
{
$res = $this->followingRedirects()
->post('/articles', [
'title' => 'article 1',
'content' => 'content 1'
]);
$res->assertStatus(200)
->assertViewIs('articles.show')
->assertSee('article 1');
}
}
?>
Результат выполнения теста:
"OK (1 test, 3 assertions)"
Пример
Проверим цепочку из нескольких редиректов, когда промежуточные маршруты также выполняют перенаправление:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class RedirectChainTest extends TestCase
{
use RefreshDatabase;
public function test_complex_redirect_chain()
{
$res = $this->followingRedirects()
->get('/old-articles');
$res->assertStatus(200)
->assertViewIs('articles.index')
->assertSee('All articles');
$res = $this->followingRedirects()
->get('/legacy/post/5');
$res->assertStatus(200)
->assertSee('article 5');
}
}
?>
Результат выполнения теста:
"OK (2 tests, 6 assertions)"
Пример
Сравним поведение с методом без followingRedirects и с ним для тестирования процесса аутентификации:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
class AuthTest extends TestCase
{
use RefreshDatabase;
public function test_login_without_following_redirects()
{
$res = $this->post('/login', [
'email' => 'user@example.com',
'password' => 'password'
]);
$res->assertStatus(302)
->assertRedirect('/dashboard');
}
public function test_login_with_following_redirects()
{
$res = $this->followingRedirects()
->post('/login', [
'email' => 'user@example.com',
'password' => 'password'
]);
$res->assertStatus(200)
->assertSee('Welcome to dashboard');
}
}
?>
Результат выполнения теста:
"OK (2 tests, 4 assertions)"
Смотрите также
-
метод
get,
который выполняет GET-запрос в тестах -
метод
post,
который выполняет POST-запрос в тестах -
метод
assertRedirect,
который проверяет, что ответ является редиректом -
метод
assertStatus,
который проверяет код статуса HTTP-ответа