2016-01-29 2 views
3
use Liip\FunctionalTestBundle\Test\WebTestCase; 

class ControllerTest extends WebTestCase 
{ 
    public function testSuccess() 
    { 
     $url = $this->getContainer()->get('router') 
      ->generate('name_route', array('parameter' => ' ')); 

     $this->client->request('GET', $url, 
      array(), 
      array(), 
      array(
       'HTTP_parameter_Header' => 'paramterHeader',   
      ) 
     ); 
    } 
} 

После того как я запустил тест, у меня есть сообщение об ошибке:Я хочу интегрировать getContainer() в WebTestCase

Call to a member function getContainer() on a non-object

+1

Ваше сообщение об ошибке означает, что $ это не объект, который кажется странным. Вы уверены, что ошибка исходит из вашего опубликованного кода? Я не использовал пакет Лии. Как несколько других людей предположили, что я подозреваю, что вам нужно загрузить ядро, но я не уверен. Лийп-пакет может позаботиться об этом. – Cerad

+0

Просто FYI у вас также есть орфографическая ошибка, '' paramterHeader'' должен быть '' parameterHeader'' –

ответ

2

Чтобы иметь возможность использовать контейнер внутри WebTestCase вам нужно сначала загрузить ядро с:

static::bootKernel($options); 
$container = static::$kernel->getContainer(); 
0
public function testSuccess() 
{ 
    self::bootKernel(); 
    $this->router = static::$kernel->getContainer() 
            ->get('router'); 

    $url = $this->router->generate(
     'name_route', 
     ['parameter' => ' '] 
    ); 

    $this->client->request(
     'GET', 
     $url, 
     [], 
     [], 
     [ 
      'HTTP_parameter_Header' => 'parameterHeader',   
     ] 
    ); 
} 
+0

У вас есть дополнительный '}' в конце и '-> get ('router;')' должен быть '- > get ('router'); ' –

+0

@JasonRoman Хороший глаз! Исправлена. – geoB

0

Прежде всего, обратите внимание на Accessing the Container в документации Symfony тестирования.

Ответы могут быть выполнены, но вам не нужно специально загружать ядро, если вы расширяете класс WebTestCase, так как он автоматически загружается при создании вашего клиента. Я вижу, что вы используете $this->client, что означает, что вы определили глобальный клиент для класса в своей функции setUp(). Если это так, вам просто нужно сделать:

$container = $this->client->getContainer(); 
$url = $container->get('router')->generate('name_route', array('parameter' => ' ')); 

Если вы не определили $this->client где-нибудь, то вам нужно изменить выше

// if your class extended Symfony's standard WebTestCase, this would 
// instead be $client = static::clientClient(); 
$client = static::makeClient(); 
$container = $this->client->getContainer(); 
$url = $container->get('router')->generate('name_route', array('parameter' => ' ')); 

Обратите внимание, что в документации государств Symfony:

It's highly recommended that a functional test only tests the Response. But under certain very rare circumstances, you might want to access some internal objects to write assertions. In such cases, you can access the Dependency Injection Container:

Так по Symfony вы не должны действительно быть доступ к контейнеру генерировать свой маршрут, а если посмотреть на все их другие примеры они предварительно фер вас позвонить по пути маршрута, а не получить его по имени, поэтому в вашем случае это будет:

$this->client->request('GET', '/path/for/your/route', 
    array(), 
    array(), 
    array(
     'HTTP_parameter_Header' => 'parameterHeader',   
    ) 
); 
1

Просто получить AppKernel внутри теста

require_once dirname(__DIR__).'/../../app/AppKernel.php'; 

и затем получить контейнер и Everthing еще

$kernel = new \AppKernel('test', true); 
$kernel->boot(); 

$container = self::$kernel->getContainer(); 

Я предлагаю вам поставить это в базовый класс и распространяет его во всех тестовых случаях :)

+0

Кстати, не забудьте установить правильный путь для AppKernel.php –

+0

по какой-то причине это единственное решение, которое не дает мне ошибок. Когда я настраиваю репозиторий [этот путь] (http://symfony.com/doc/current/cookbook/testing/doctrine.html), я получаю сообщение об ошибке «Сброс контейнера не разрешен, когда область действия активна». – bsapaka

Смежные вопросы