laravel - Pruebas de redireccionamiento de enlaces a sitios externos.
testing phpunit (2)
Tengo un enlace en una página /my/example/page
que enlaza con una ruta de my.route
.
Ruta
Route::group([''middleware'' => [''auth'']], function () {
Route::group([''middleware'' => [''Some/Custom/Auth/Middleware:1'']], function () {
Route::match([''GET'', ''POST''], ''/my/route/to/external/controller'', ''exampleController@externalLink'')->name(''my.route'');
}
}
Enlace en /my/example/page
<a href="/my/route/to/external/controller">Link</a>
Esta ruta /my/route/to/external/controller
apunta a este método de controlador externalLink
en el controlador exampleController
, que devuelve la url para que la utilice href
public function externalLink()
{
return $this->redirect->away(''www.externalsite.com'');
}
Mi prueba es
$this->visit(/my/example/page)
->click(''Link'')
->assertRedirectedToRoute(''my.route'');
Constantemente me sale el error
Symfony / Component / HttpKernel / Exception / NotFoundHttpException
cuando uso el método de prueba click()
Puedo detectar esto usando @expectedException
pero su no ayuda, ya que espero ver una página diferente.
También lo he intentado (no juntos);
->assertResponseStatus(200);
->seePageIs(''www.externalsite.com'');
->assertRedirect();
->followRedirects();
Desde la inspección del navegador, cuando se hace clic en la url obtengo
http://www.example.com/my/route/to/external 302
http://www.externalsite.com 200
¿Cómo puedo probar funcionalmente el botón al hacer clic y redirigir a un sitio externo?
Estoy luchando con un problema similar en este momento, y casi he renunciado a probar el punto final directamente. Optando por una solución como esta ...
Compruebe que el enlace contiene información adecuada en la vista:
$this->visit(''/my/example/page'')
->seeElement(''a'', [''href'' => route(''my.route'')]);
Mover la lógica en el controlador a algo que puede probar directamente. El paquete Laravel / Socialite tiene algunas pruebas interesantes que podrían ser útiles si haces esto ...
class ExternalLinkRedirect {
public function __construct($request){
$this->request = $request;
}
public function redirect()
{
return redirect()->away(''exteranlsite.com'');
}
}
Entonces prueba directamente
$route = route(''my.route'');
$request = /Illuminate/Http/Request::create($route);
$redirector = new ExternalLinkRedirect($request);
$response = $redirector->redirect();
$this->assertEquals(''www.externalsite.com'', $response->getTargetUrl());
Una forma sencilla es utilizar el método get
lugar de visit
.
Un ejemplo: $this->get(''/facebook'') ->assertRedirectedTo(''https://www.facebook.com/Les-Teachers-du-NET-516952535045054'');