2015-05-19 4 views
3

Я делаю функциональные тесты контроллеров Symfony2, наследуя мои тестовые классы от этого:маркер пользователя в Symfony2 Функциональные тесты

class InsecureWebTestCase extends WebTestCase { 

    protected $client = null; 

    public function setUp() { 
     $this->client = static::createClient(); 
     $session = $this->client->getContainer()->get('session'); 
     $firewall = 'default'; 
     $token = new UsernamePasswordToken('[email protected]', null, $firewall, array('ROLE_USER', 'ROLE_ADMIN')); 
     // $this->client->getContainer()->get('security.context')->setToken($token); 
     $session->set("_security_$firewall", serialize($token)); 
     $session->save(); 
     $cookie = new Cookie($session->getName(), $session->getId()); 
     $this->client->getCookieJar()->set($cookie); 
    } 

} 

Если я использую контроллер в качестве части приложения: $this->container->get('security.token_storage')->getToken()->getUser() и $this->getUser() случаи моего субъекта «доктрина».

Но при запуске функциональных тестов: $this->container->get('security.token_storage')->getToken()->getUser() - это строка, содержащая имя пользователя и $this->getUser(): NULL.

Что мне нужно сделать, чтобы поведение было согласованным в моем приложении и функциональных тестах?

+0

попробовать этот способ при выполнении запроса по: запрос '$ client-> (» GET ','/post/12 ', array(), array(), array ( ' PHP_AUTH_USER '=>' username ', ' PHP_AUTH_PW '=>' pa $$ word ', )); ' – smarber

ответ

5

Посмотрите на источник UsernamePasswordToken:

class UsernamePasswordToken extends AbstractToken 
{ 

    /** 
    * Constructor. 
    * 
    * @param string|object   $user  The username (like a nickname, email address, etc.), or a UserInterface instance or an object implementing a __toString method. 
    * @param string     $credentials This usually is the password of the user 
    * @param string     $providerKey The provider key 
    * @param RoleInterface[]|string[] $roles  An array of roles 
    * 
    * @throws \InvalidArgumentException 
    */ 
    public function __construct($user, $credentials, $providerKey, array $roles = array()) 

особенно $ описанию пользователя парам

@param строка | объект $ пользователя по имени пользователя (подобно ник, адрес электронной почты и т.д.), или экземпляр UserInterface или объект

Так что при использовании приложения вы проходите мимо u ser в качестве $ user param, но вы передаете строку электронной почты в своем тесте.

Так первый способ создать новый пользовательский объект и заполнить его с некоторыми тестовыми данными или получить определенный пользователь из своего хранилища, как:

$user = $client->getContainer()->get('doctrine')->getManager()->getRepository('MyAppUserBundle:User')->findOneByEmail('[email protected]'); 
$token = new UsernamePasswordToken($user, null, $firewall, array('ROLE_USER', 'ROLE_ADMIN')); 
+0

Простой ответ тогда ... просто передайте макет или реальный пользовательский объект в конструктор 'UsernamePasswordToken' вместо имени пользователя (как это предлагается в документах Symfony2) –

+0

да точно! :) –