2012-06-02 5 views
1

В моем тесте я хотел бы указать cookie, чтобы согласиться с запросом. Я проследил код обратно, чтобы увидеть, как банку cookie используется в __construct клиента. Хотя var_dump здесь и var_dump на стороне сервера не показывают, что cookie отправляется с запросом. Я также попытался отправить более простую строку с HTTP_COOKIE, как показано.symfony2 test case request cookie

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\BrowserKit\Cookie; 
use Symfony\Component\BrowserKit\CookieJar; 
class DefaultControllerTest extends WebTestCase { 
    public function test() { 
     $jar = new CookieJar(); 
     $cookie = new Cookie('locale2', 'fr', time() + 3600 * 24 * 7, '/', null, false, false); 
     $jar->set($cookie); 
     $client = static::createClient(array(), array(), $jar); //this doesn't seem to attach cookies as expected! 
     $crawler = $client->request(
      'GET', //method 
      '/', //uri 
      array(), //parameters 
      array(), //files 
      array(
       'HTTP_ACCEPT_LANGUAGE' => 'en_US', 
       //'HTTP_COOKIE' => 'locale2=fr' //this doesn't work either! 
      ) //server 
     ); 

     var_dump($client->getRequest()); 
    } 
} 
+0

Вы пытались создать объект, как [здесь] (http://stackoverflow.com/questions/8432281/symfony2-read-cookie) с '$ this-> get ('request');' или создавая что-то вроде '$ response = new RedirectResponse ($ url); $ response-> headers-> setCookie (новое Cookie (... '? – AleksanderKseniya

ответ

10

У вас ошибка в коде:

$client = static::createClient(array(), array(), $jar); // Third parameter ? 

createClient Метод определяется следующим образом (для Symfony 2.0.0):

static protected function createClient(array $options = array(), array $server = array()) 

Таким образом, он принимает только два параметра и нет места для печенья, потому что метод createClient принимает экземпляр клиента из тестового контейнера:

$client = static::$kernel->getContainer()->get('test.client'); 
$client->setServerParameters($server); 

return $client; 

Вот определение для test.client службы:

<service id="test.client" class="%test.client.class%" scope="prototype"> 
    <argument type="service" id="kernel" /> 
    <argument>%test.client.parameters%</argument> 
    <argument type="service" id="test.client.history" /> 
    <argument type="service" id="test.client.cookiejar" /> 
</service> 

<service id="test.client.cookiejar" class="%test.client.cookiejar.class%" scope="prototype" /> 

Теперь мы видим, что служба куков вводятся в test.client и имеет объем prototype, что означает, что новый объект будет создан при каждом доступе к это обслуживание.

Однако Client класса имеет метод getCookieJar(), и вы можете использовать его, чтобы установить определенные кук для запроса (не тестировалось, но должно работать):

$client = static::createClient(); 
$cookie = new Cookie('locale2', 'fr', time() + 3600 * 24 * 7, '/', null, false, false); 
$client->getCookieJar()->set($cookie); 
+0

Полное объяснение! Последний блок кода работал как шарм. – ojreadmore