测试重定向到外部站点的链接

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)