myo*_*yol 18 testing phpunit laravel
我在/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');
}
}
Run Code Online (Sandbox Code Playgroud)
链接 /my/example/page
<a href="/my/route/to/external/controller">Link</a>
Run Code Online (Sandbox Code Playgroud)
此路由/my/route/to/external/controller指向控制器externalLink中的此控制器方法,该方法exampleController返回要使用的href的url
public function externalLink()
{
return $this->redirect->away('www.externalsite.com');
}
Run Code Online (Sandbox Code Playgroud)
我的考试是
$this->visit(/my/example/page)
->click('Link')
->assertRedirectedToRoute('my.route');
Run Code Online (Sandbox Code Playgroud)
我不断得到错误
Symfony的\分量\ HttpKernel \异常\ NotFoundHttpException
当我使用click()测试方法.
我可以使用它,@expectedException但他没有帮助,因为我希望看到一个不同的页面.
我也试过(不在一起);
->assertResponseStatus(200);
->seePageIs('www.externalsite.com');
->assertRedirect();
->followRedirects();
Run Code Online (Sandbox Code Playgroud)
从浏览器检查,当点击网址时,我得到了
http://www.example.com/my/route/to/external 302
http://www.externalsite.com 200
Run Code Online (Sandbox Code Playgroud)
如何在功能上测试被点击的按钮并重定向到外部站点?
小智 4
我现在正在努力解决类似的问题,我几乎放弃了直接测试端点。选择这样的解决方案......
测试链接在视图中是否包含正确的信息:
$this->visit('/my/example/page')
->seeElement('a', ['href' => route('my.route')]);
Run Code Online (Sandbox Code Playgroud)
将控制器中的逻辑移至可以直接测试的地方。Laravel \Socialite 包有一些有趣的测试,如果你这样做可能会有所帮助......
class ExternalLinkRedirect {
public function __construct($request){
$this->request = $request;
}
public function redirect()
{
return redirect()->away('exteranlsite.com');
}
}
Run Code Online (Sandbox Code Playgroud)
然后直接测试
$route = route('my.route');
$request = \Illuminate\Http\Request::create($route);
$redirector = new ExternalLinkRedirect($request);
$response = $redirector->redirect();
$this->assertEquals('www.externalsite.com', $response->getTargetUrl());
Run Code Online (Sandbox Code Playgroud)