我在页面/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', 'exampleController@externalLink')->name('my.route');
}
}
/my/example/page
<a href="/my/route/to/external/controller">Link</a>
此路由/my/route/to/external/controller
指向externalLink
控制器中的此控制器方法exampleController
,该控制器方法返回要使用的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 :(得分: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());
答案 1 :(得分:2)
一种简单的方法是使用get
方法而不是visit
。
一个例子:
$this->get('/facebook')
->assertRedirectedTo('https://www.facebook.com/Les-Teachers-du-NET-516952535045054');