【发布时间】: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