2016-04-22 4 views
15

मेरे पास एक पृष्ठ /my/example/page पर एक लिंक है जो एक लार्वेल मार्ग 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> 

exampleController नियंत्रक में इस नियंत्रक विधि externalLink को इस मार्ग /my/route/to/external/controller अंक, जो href के लिए यूआरएल रिटर्न का उपयोग करने पर

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

मेरा परीक्षण

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

मैं लगातार त्रुटि

Symfony \ घटक \ HttpKernel \ अपवाद \ NotFoundHttpException

जब मैं click() परीक्षण विधि का उपयोग मिलता है।

मैं इसे @expectedException का उपयोग करके पकड़ सकता हूं लेकिन उसकी मदद नहीं करता क्योंकि मुझे एक अलग पृष्ठ देखने की उम्मीद है।

मैंने भी कोशिश की है (एक साथ नहीं);

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

ब्राउज़र निरीक्षण से, जब यूआरएल क्लिक किया जाता है मैं

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

मैं कैसे कार्यात्मक परीक्षण कर सकते हैं बटन क्लिक किया और एक बाहरी साइट के लिए पुनः निर्देशित किया जा रहा है?

+0

क्या अपने मार्ग कैसा दिखता है? – tptcat

+0

@tptcat मैंने प्रश्न अपडेट किया है – myol

उत्तर

4

मैं अभी भी इसी तरह की समस्या से जूझ रहा हूं, और मैंने सीधे एंडपॉइंट का परीक्षण करने के बारे में छोड़ दिया है। इस तरह एक समाधान के लिए चयन ...

टेस्ट उस लिंक को ध्यान में रखते उचित जानकारी होती है:

$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

एक आसान तरीका visit के बजाय get विधि का उपयोग करने के लिए है का परीक्षण करें।

एक उदाहरण: $this->get('/facebook') ->assertRedirectedTo('https://www.facebook.com/Les-Teachers-du-NET-516952535045054');

संबंधित मुद्दे