6
// 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
4

2 に答える 2

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 のテスト ドキュメントで詳述されているのと同じ例に従うことができます。

さらに詳しい情報が必要な場合は、クローラー コンポーネントのドキュメントとクラス リファレンスを参照してください

于 2012-09-05T14:03:45.670 に答える
1

テストクライアントを作成するため、環境では使用WebTestCaseしないでください。prodWebTestCase::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);
于 2012-09-05T13:55:01.073 に答える