0

我正在尝试运行一个单元测试来检查资产是否正确安装。我只是向现有文件发出请求并检查是否没有错误:

$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”的路由

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

4

2 回答 2

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!';
}
于 2012-10-22T02:25:13.987 回答
1

测试客户端实际上并没有访问您的 Web 服务器,它直接通过您的应用程序模拟请求。

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

正如@Lusitanian 建议的那样,您可以使用 PHP 必须提供的标准文件函数来检查它是否存在。

如果您需要帮助定位这些资产的路径,请查看以下Kernel::locateResource()方法:

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

如果找不到资源,这将引发异常。

于 2012-10-22T02:35:03.580 回答