Тестирование перенаправления ссылок на внешние сайты

У меня есть ссылка на странице /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');