Тестирование перенаправления ссылок на внешние сайты
У меня есть ссылка на странице /my/example/page
, которая ссылается на маршрут laravel my.route
.
Маршрут
Route::group(['middleware' => ['auth']], function () {
Route::group(['middleware' => ['Some\Custom\Auth\Middleware:1']], function () {
Route::match(['GET', 'POST'], '/my/route/to/external/controller', '[email protected]')->name('my.route');
}
}
Ссылка на /my/example/page
<a href="/my/route/to/external/controller">Link</a>
Этот маршрут /my/route/to/external/controller
указывает на этот метод контроллера externalLink
в контроллере exampleController
, который возвращает URL-адрес для href для использования
public function externalLink()
{
return $this->redirect->away('www.externalsite.com');
}
Мой тест
$this->visit(/my/example/page)
->click('Link')
->assertRedirectedToRoute('my.route');
Я постоянно получаю ошибку
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
когда я использую метод тестирования click()
.
Я могу поймать это, используя @expectedException
, но его не помогает, поскольку я ожидаю увидеть другую страницу.
Я также пробовал (не вместе);
->assertResponseStatus(200);
->seePageIs('www.externalsite.com');
->assertRedirect();
->followRedirects();
Из проверки браузера, когда щелкнул URL, я получаю
http://www.example.com/my/route/to/external 302
http://www.externalsite.com 200
Как я могу функционально протестировать кнопку нажатой и перенаправлять на внешний сайт?
Ответы
Ответ 1
Я сейчас борюсь с подобной проблемой, и я просто отказался от тестирования конечной точки напрямую. Выбор такого решения...
Проверьте, что ссылка содержит правильную информацию в представлении:
$this->visit('/my/example/page')
->seeElement('a', ['href' => route('my.route')]);
Перемещение логики в контроллере на что-то, что вы можете проверить напрямую. Laravel\Socialite package содержит интересные тесты, которые могут быть полезны, если вы это сделаете...
class ExternalLinkRedirect {
public function __construct($request){
$this->request = $request;
}
public function redirect()
{
return redirect()->away('exteranlsite.com');
}
}
Затем проверьте его непосредственно
$route = route('my.route');
$request = \Illuminate\Http\Request::create($route);
$redirector = new ExternalLinkRedirect($request);
$response = $redirector->redirect();
$this->assertEquals('www.externalsite.com', $response->getTargetUrl());
Ответ 2
Простым способом является использование метода get
вместо visit
.
Пример:
$this->get('/facebook')
->assertRedirectedTo('https://www.facebook.com/Les-Teachers-du-NET-516952535045054');