2012-10-22 96 views
0

我试图运行一个单元测试,检查资产是否正确安装。 我只是让现有文件的请求,并检查是否有任何错误:检查资产是否安装在symfony2

$client = static::createClient(); 
$client->request('GET', '/bundles/mybundle/css/bg.css'); 
$this->assertFalse($client->getResponse()->isNotFound(), "Assets seem to not be installed"); 

不幸的是,与Response实例检查后,它总是试图与路线达成某种控制器:

未找到“GET /bundles/mybundle/css/bg.css”路由的路由

有没有办法在不通过路由系统的情况下发出纯请求?

回答

2

您需要使用实际的HTTP客户端(您用于功能测试的客户端实现并不实际发出HTTP请求)发出该请求,但您似乎正在接近这个错误方式。安装资产应该是您的部署后部署脚本的一部分 - 因此测试总是(或者有时取决于您的开发框的配置,但重点在于它是部署/分段详细信息)无论如何都会失败。只需在您希望确保资产安装正确的任何语言的部署过程中进行简单的测试。

简单的例子

<?php 
system('git clone myrepo'); 
echo 'Pulled codebase'; 
system('composer install'); // install dependencies 
echo 'Dependencies installed'; 
system('php app/console assets:install web --symlink'); // install assets 
echo 'Assets installed -- testing for presence'; 
if(!file_exists('blah.gif')) { 
    echo 'assets not installed! error!'; 
} 
+0

我认为这是检查文件是否在正确目录中的有效方法。看起来单元测试是测试内部功能(不是真的做任何http连接);我不知道。 我看到做一个实际的请求来检查文件是否存在可能超出了范围,我应该按照你提到的方式。 – jsgoupil

1

测试客户端实际上不打你的Web服务器,它通过应用程序直接模拟的请求。

因此,它永远不会用于检查资产是否存在于您的文件结构中。它可以用于动态加载的资产,但这不是这种情况,通常也不是这种情况。

作为@Lusitanian的建议,你可以使用PHP提供的标准文件函数来检查它是否存在。

如果您需要帮助查找这些资产的路径,检查出Kernel::locateResource()方法:

$this->container->get('kernel')->locateResource('@AcmeDemoBundle/Resources/public/css/main.css'); 

这将抛出一个异常,如果没有被发现的资源。

+0

有道理。是的,我只注意到单元测试没有提出任何HTTP请求。 locateResource会查找它们的位置,但不会检查它是否已安装。 感谢您的回答。我会按照@Lusitanian的建议重新审视这个测试。 – jsgoupil