我正在尝试编写一个symfony 2命令,该命令基本上可以读取多个路径(通过yml文件或通过参数),并可以获取每个页面的响应,以便我可以报告是否他们回来了200/404/502等。 路线是相对的,所以路线如'/'和'/ news'。
似乎无法解决如何发送这些请求以获得真实的响应,我可以使用Request :: create()来创建请求,但这似乎并不像我想要的那样。
即使是命令,我是否必须通过内核?任何帮助将不胜感激。
到目前为止我所拥有的:
$request = Request::create('/news', 'GET');
$response = new Response();
$response->prepare($request);
$res = $response->send();
var_dump($res->getContent());
这一直以空字符串返回。
还尝试了以下内容:
$client = new Client(
new HttpKernel(new EventDispatcher(), new ControllerResolver())
);
$client->request('GET', '/news');
var_dump($client->getResponse());
带有路由的错误配置错误
由于 凯文
答案 0 :(得分:0)
最好的方法是使用http客户端来转移创建请求对象的责任,执行请求并返回响应。
其中最常用的是guzzle http客户端(http://docs.guzzlephp.org/en/latest/)
因此,在您的命令中,您可以从容器中获取路由器,为其生成URL,并使用guzzle客户端执行请求。
评论后编辑:
要实现请求而不实际运行服务器,您可以使用\ Symfony \ Bundle \ FrameworkBundle \ Client对象使用内核执行请求 - 响应(您当然要注入您当前的内核)命令)。就像WebTestCase类一样。
http://api.symfony.com/2.8/Symfony/Bundle/FrameworkBundle/Client.html
希望这会有所帮助! (我稍后会用一些代码更新)
答案 1 :(得分:0)
根据your comment:
基本上我测试代码库以确保在我向公众发布它之前所有设置都正常,所以我想模拟客户端对代码的请求并确保我得到200响应,如果404回来那么我知道暂停发布会有问题。
使用test:
很容易做到这一点<?php
// tests/AppBundle/Controller/PostControllerTest.php
namespace Tests\AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class PostControllerTest extends WebTestCase
{
public function testNews()
{
$client = static::createClient();
$crawler = $client->request('GET', '/news');
// Assert a specific 200 status code
$this->assertEquals(
200, // or Symfony\Component\HttpFoundation\Response::HTTP_OK
$client->getResponse()->getStatusCode()
);
}
}
您还需要安装PHPUnit:
composer require --dev "phpunit/phpunit=5.4.*"
然后你可以启动测试:
php ./vendor/bin/phpunit -c app/phpunit.xml.dist
你会得到这样的结果:
PHPUnit 5.4.6 by Sebastian Bergmann and contributors.
..................... 21 / 21 (100%)
Time: 5.29 seconds, Memory: 58.00MB
OK (21 tests, 149 assertions)