如何将Symfony DomCrawler与Laravel的子域路由一起使用?

时间:2014-07-23 13:47:30

标签: php unit-testing symfony laravel phpunit

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

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肯定会正常解析并且没有我能看到的问题。这似乎是一个特定的问题,试图强制子域的标题。

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

2 个答案:

答案 0 :(得分:0)

我开始了一个空白项目,试图通过子域路由来处理这个问题,并且它工作得很好。我意识到这个问题必须与我写的一样。

原来问题实际上是我写的一个帮助器来检索域名。它试图访问运行时测试无法使用的$ _SERVER变量。如果它无法检索值,那么返回一个开发域就解决了我的问题。

答案 1 :(得分:0)

试试这个:

public function refreshApplication() 
{
    parent::refreshApplication();

    $this->client = $this->createClient(
        array('HTTP_HOST' => 'site1.domain.dev'));
}

public function testSomething()
{
    $crawler = $this->client->request('GET', '/something');
}