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

时间:2016-04-22 09:29:45

标签: laravel testing phpunit

我在页面/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

如何在功能上测试被点击按钮并重定向到外部网站?

2 个答案:

答案 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');