【问题标题】:How do I use the Symfony DomCrawler with Laravel's subdomain routing?如何将 Symfony DomCrawler 与 Laravel 的子域路由一起使用?
【发布时间】:2014-07-23 13:47:29
【问题描述】:

目前我的网站旨在提供多个子域,如下所示:

Route::group(array('domain' => 'site1'.AppHelper::getDomain()), function(){
    Route::get('{state?}/{variant?}', array("uses" => 'Site1Controller@showIndex'));
});

Route::group(array('domain' => 'site2'.AppHelper::getDomain()), function(){
    Route::get('{state?}/{variant?}', array("uses" => 'Site2Controller@showIndex'));
});

Route::group(array('domain' => 'site3'.AppHelper::getDomain()), function(){
    Route::get('{state?}/{variant?}', array("uses" => 'Site3Controller@showIndex'));
});

现在我想编写一些测试来抓取这些页面以检查特定内容。不幸的是,我可以在 Symfony DomCrawler 上找到的唯一 documentation 子域告诉我这样做(假设这是我测试的第 312 行):

$crawler = $this->$client->request('GET', '/', array(), array(), array(
        'HTTP_HOST'       => 'site1.domain.dev',
        'HTTP_USER_AGENT' => 'Symfony/2.0',
    ));

不幸的是,当我运行 PHPUnit 并进入这个测试时,我看到了这个:

1) SiteTest::testSite1ForContent
Symfony\Component\HttpKernel\Exception\NotFoundHttpException:

/var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1429
/var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1050
/var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php:1014
/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:576
/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:597
/var/www/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
/var/www/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:339
/var/www/app/tests/SiteTest.php:312

那么我在这里不明白的是什么? site1.domain.dev 肯定可以正常解决,并且我看不到任何问题。这似乎是一个特定于尝试强制子域标头的问题。

即使没有解决方案,我该如何正确调试它?我想弄清楚为什么它不工作/哪里失败了,因为这是我第一次尝试编写测试。

【问题讨论】:

  • 我不明白。您有由 willcard 构建的子域吗?为什么不将第二个参数设置为固定http://site1.domain.dev/ 而不是/
  • 好吧,子域被声明为 (site1, site2, site3) 作为路由组,而实际路由的 {state?}/{variant?} 部分用于处理诸如 site1.domain 之类的事情。 dev/TX/a 表示它是位于德克萨斯州的 site1 站点,并使用该站点的 A 变体(A/B 测试)。据我所知,这些都不是问题,因为它们都是可选的。转到 site1.domain.dev/ 仍然会匹配该模式,并且在手动访问时会匹配。尝试创建 DomCrawler 时只是一个问题
  • 在重新阅读您的评论时,您似乎在谈论实际的 DomCrawler。我之前曾尝试将其定义为$crawler = $this->client->request('GET', http://site1.domain.dev/');,但这给了我同样的错误。我不明白为什么会这样。
  • 您确定要通过$this->$client 制作这个吗?您是否将对象名称保留在变量中?
  • 你可能发现了一个错字,我后来删掉了。这似乎是 Laravel 中子域组特有的问题。如果我改为使用$crawler = $this->client->request('GET', '/'); 并创建一个非基于组的路由闭包,则测试可以完美运行并且可以被抓取。它只是在解决子域时遇到了麻烦。这可能是我必须去 Laravel IRC 解决的问题,但我会继续努力解决它。

标签: php unit-testing symfony laravel phpunit


【解决方案1】:

我开始了一个空白项目,只是尝试使用子域路由来处理这个问题,并且效果很好。我意识到问题一定出在我写的东西上。

原来问题实际上出在我为检索域而编写的帮助程序上。它试图访问在运行时对测试不可用的 $_SERVER 变量。如果它无法检索值,则返回一个开发域解决了我的问题。

【讨论】:

    【解决方案2】:

    试试这个:

    public function refreshApplication() 
    {
        parent::refreshApplication();
    
        $this->client = $this->createClient(
            array('HTTP_HOST' => 'site1.domain.dev'));
    }
    
    public function testSomething()
    {
        $crawler = $this->client->request('GET', '/something');
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 2020-05-24
      • 2021-07-01
      • 1970-01-01
      • 2014-02-15
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多