laravel testing phpunit

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'');