Пользовательский токен в функциональных тестах 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,

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

3

Решение

Посмотрите на 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())

особенно для описания параметров $ user

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

Таким образом, при использовании приложения вы передаете пользовательскую сущность в виде $ 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'));
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]