【问题标题】:Testing redirect links to external sites测试指向外部站点的重定向链接
【发布时间】:2016-08-15 20:42:09
【问题描述】:

我在页面 /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指向exampleController控制器中的这个控制器方法externalLink,它返回要使用的href的url

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

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

【问题讨论】:

  • 你的路线是什么样的?
  • @tptcat 我已经更新了问题

标签: laravel testing phpunit


【解决方案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');

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 2015-01-13
      • 2012-03-23
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多