Php 检查symfony2中是否安装了资产

Php 检查symfony2中是否安装了资产,php,symfony,Php,Symfony,我正在尝试运行一个单元测试,检查资产是否正确安装。 我只需向现有文件发出请求,并检查是否没有错误: $client=static::createClient(); $client->request('GET','/bundles/mybundle/css/bg.css'); $this->assertFalse($client->getResponse()->isNotFound(),“资产似乎未安装”); 不幸的是,在检查响应实例后,它总是试图通过路由到达某种控制器: 找不到“GET/bun

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

$client=static::createClient();
$client->request('GET','/bundles/mybundle/css/bg.css');
$this->assertFalse($client->getResponse()->isNotFound(),“资产似乎未安装”);
不幸的是,在检查响应实例后,它总是试图通过路由到达某种控制器:

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


这里有没有一种方法可以在不经过路由系统的情况下发出纯请求?

您需要使用实际的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!';
}

您需要使用实际的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!';
}

测试客户端实际上并没有命中您的web服务器,而是直接通过您的应用程序模拟请求

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

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

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

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

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

测试客户端实际上没有命中web服务器,它直接通过应用程序模拟请求

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

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

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

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

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

我认为这是检查文件是否位于正确目录中的有效方法。单元测试似乎是测试内部功能(而不是真正建立任何http连接);我不知道。我看到,实际请求检查文件是否存在可能超出了范围,我应该按照您提到的方式进行。我认为这是检查文件是否位于正确目录的有效方法。单元测试似乎是测试内部功能(而不是真正建立任何http连接);我不知道。我认为,提出实际请求检查文件是否存在可能超出了范围,我应该按照您提到的方式进行。这是有道理的。是的,我刚刚注意到单元测试没有发出任何HTTP请求。locateResource将找到资源所在的位置,但不会检查是否已安装。谢谢你的回答。我将按照@Lusitanian的建议重新审视这个测试。这是有意义的。是的,我刚刚注意到单元测试没有发出任何HTTP请求。locateResource将找到资源所在的位置,但不会检查是否已安装。谢谢你的回答。我将按照@Lusitanian的建议重新审视这个测试。