lundi 5 janvier 2015

How to get the current logged user in unit test?

I have this unit test :



class ProjectControllerTest extends WebTestCase
{

private $client = null;
private $user = null;
private $projectName = null;
private $em;

public function setUp()
{
$this->client = static::createClient();
$this->user = new User;
$this->createAuthorizeClient($this->client);

static::$kernel = static::createKernel();
static::$kernel->boot();
$this->em = static::$kernel->getContainer()->get('doctrine.orm.entity_manager');
}

public function testProjectNameEdition()
{
$project = new Project();
$project
->setName(uniqid())
->setComment('test')
;
$this->em->persist($project);
$this->em->flush();

$crawler = $this->client->request('GET', '/project/' . $project->getId() . '/edit');
$form = $crawler->selectButton('codex_gui_project_submit')->form();
$form['codex_gui_project[name]'] = $this->projectName . '1';
$this->client->submit($form);

$editProject = $this->em->getRepository('AcmeFooBundle:Project')->findOneByName($oldProjectName . '1');
$this->assertEquals($this->projectName . '1', $editProject->getName());
}

public function createAuthorizeClient($client)
{
$container = static::$kernel->getContainer();
$session = $container->get('session');
$user = self::$kernel
->getContainer()->get('doctrine')
->getRepository('AcmeFooBundle:User')
->findOneByUsername('Nico')
;
$token = new UsernamePasswordToken($user, $user->getUserName(), 'main', $user->getRoles());

$session->set('_security_main', serialize($token));
$session->save();
$client->getCookieJar()->set(new Cookie($session->getName(), $session->getId()));

return $client;
}
}


Then when the new entity is persisted, the current user is getting in the ProjectListenner :



class ProjectListener
{

protected $container;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
}

/**
* Prepersist a creation of project
*
* @param \Doctrine\ORM\Event\LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();

if ($entity instanceof Project) {
// Save the user and the created date
$usr = $this->container->get('security.context')->getToken()->getUser();
$entity->setCreated(new \DateTime());
$entity->setCreator($usr);
}
}


So this error happened when I run the test :



...PHP Fatal error: Call to a member function getUser() on a non-object in /var/www/codex_gui/vendor/acme/foo/Acme/foo/fooBundle/Listener/ProjectListener.php on line 32



Aucun commentaire:

Enregistrer un commentaire