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(
            'norbert.scrunge@gmail.com',
            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

我需要做什么才能使行为在我的应用程序和功能测试中保持一致?

查看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字符串|对象$ user the用户名(就像一个 昵称,电子邮件地址等)或用户接口实例或 对象

因此,在应用程序使用情况下,您将用户实体作为$用户参数传递,但是您正在测试中传递电子邮件字符串。

因此,第一种方法是创建新的用户对象,并用一些测试数据填充或从其存储库中获取某些用户,例如:

$user = $client->getContainer()->get('doctrine')->getManager()->getRepository('MyAppUserBundle:User')->findOneByEmail('norbert.scrunge@gmail.com');
$token = new UsernamePasswordToken($user, null, $firewall, array('ROLE_USER', 'ROLE_ADMIN'));

最新更新