在控制器中使用爬虫

时间:2012-09-05 13:39:10

标签: php unit-testing testing symfony

// src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php
namespace Acme\DemoBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class DemoControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient();

        $crawler = $client->request('GET', '/demo/hello/Fabien');

        $this->assertGreaterThan(0, $crawler->filter('html:contains("Hello Fabien")')->count());
    }
}

这在我的测试中运行正常,但我想在控制器中使用此爬虫。我该怎么办?

我制作路线,并添加到控制器:

<?php

// src/Ens/JobeetBundle/Controller/CategoryController

namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\DemoBundle\Entity\Category;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class CategoryController extends Controller
{   
  public function testAction()
  {
    $client = WebTestCase::createClient();

    $crawler = $client->request('GET', '/category/index');
  }

}

但这会给我带来错误:

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in /acme/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Test/WebTestCase.php on line 24

2 个答案:

答案 0 :(得分:4)

WebTestCase类是一个特殊的类,旨在在测试框架(PHPUnit)中运行,您不能在控制器中使用它。

但您可以像这样创建一个HTTPKernel客户端:

use Symfony\Component\HttpKernel\Client;

...

public function testAction()
{
    $client = new Client($this->get('kernel'));
    $crawler = $client->request('GET', '/category/index');
}

请注意,您只能使用此客户端浏览自己的symfony应用程序。如果要浏览外部服务器,则需要使用其他客户端,如goutte。

此处创建的抓取工具与WebTestCase返回的抓取工具相同,因此您可以按照symfony testing documentation

中详述的相同示例进行操作

如果您需要更多信息,here是抓取工具组件的文档,here是类参考

答案 1 :(得分:1)

您不应在WebTestCase环境中使用prod,因为WebTestCase::createClient()会创建测试客户端。

在您的控制器中,您应该执行以下操作(我建议您使用Buzz\Browser):

use Symfony\Component\DomCrawler\Crawler;
use Buzz\Browser;

...
$browser = new Browser();
$crawler = new Crawler();

$response = $browser->get('/category/index');
$content = $response->getContent();
$crawler->addContent($content);