2016-04-22 14 views
15

Ho un collegamento su una pagina /my/example/page che collega a una route laravel my.route.Test dei collegamenti di reindirizzamento a siti esterni

percorso

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

link sul /my/example/page

<a href="/my/route/to/external/controller">Link</a> 

Questo itinerario /my/route/to/external/controller punti a questo metodo di controllo externalLink nel controller exampleController, che restituisce l'URL per il href di utilizzare

public function externalLink() 
{ 
    return $this->redirect->away('www.externalsite.com'); 
} 

Il mio test è

$this->visit(/my/example/page) 
    ->click('Link') 
    ->assertRedirectedToRoute('my.route'); 

Ricevo constantemente l'errore

Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException

quando uso il metodo di click() test.

Posso prendere questo utilizzando @expectedException ma il suo non aiuta come mi aspetto di vedere una pagina diversa.

Ho anche provato (non insieme);

->assertResponseStatus(200); 
->seePageIs('www.externalsite.com'); 
->assertRedirect(); 
->followRedirects(); 

Da un'ispezione del browser, quando l'URL viene cliccato ottengo

http://www.example.com/my/route/to/external  302 
http://www.externalsite.com      200 

Come posso funzionalmente provare il pulsante viene cliccato e reindirizzamento a un sito esterno?

+0

cosa fa il tuo percorso simile? – tptcat

+0

@tptcat Ho aggiornato la domanda – myol

risposta

4

In questo momento sono alle prese con un problema simile e ho appena rinunciato a testare direttamente l'endpoint. Optando per una soluzione come questa ...

prova che il link contiene informazioni corrette nella vista:

$this->visit('/my/example/page') 
    ->seeElement('a', ['href' => route('my.route')]); 

Spostare la logica nel controller per qualcosa che si può provare direttamente. Il Laravel\Socialite package ha alcune prove interessanti che potrebbero essere utili se si fa questo ...

class ExternalLinkRedirect { 
    public function __construct($request){ 
     $this->request = $request; 
    } 

    public function redirect() 
    { 
     return redirect()->away('exteranlsite.com'); 
    } 
} 

Poi testare direttamente

$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

Un modo semplice è quello di utilizzare il metodo al posto di visitget.

Un esempio: $this->get('/facebook') ->assertRedirectedTo('https://www.facebook.com/Les-Teachers-du-NET-516952535045054');