2017-06-24 2 views
1

Je veux tester mon application créée dans Symfony 3.3.2.
J'utilise FOSUserBundle comme système de mon utilisateur.Test fonctionnel dans Symfony 3.3 avec faux utilisateur

créer un nouveau client dans setUp

public function setUp() { 
    $this->client = static::createClient(); 
} 

j'ai écrit une fonction simple qui devrait créer l'utilisateur faux par le service fos

private function logInAdmin() { 
    $fosLoginManager = $this->client->getContainer()->get('fos_user.security.login_manager'); 

    $user = new User(); 
    $user->setEnabled(true); 
    $user->addRole('ROLE_ADMIN'); 

    $fosLoginManager->logInUser('main', $user); 
} 

En fait, ce qui se passe mais seulement quand je tester ce code manuellement dans le contrôleur. Dans ce cas, je suis connecté en tant qu'utilisateur dont je viens de créer dans le code. J'ai mes rôles etc. Mais quand PHPUnit exécute ce code, l'utilisateur devient null.

Pourquoi cela se produit-il? Comment le faire correctement?

Répondre

1
<?php 


namespace AdminBundle\Security; 


use Symfony\Bundle\FrameworkBundle\Client; 
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\BrowserKit\Cookie; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

class LoginTest extends WebTestCase 
{ 

    /** 
    * @var Client 
    */ 
    private $client = null; 

    protected function setUp() 
    { 
     $this->client = static::createClient(); 


    } 
    private function logIn() 
    { 
     $session = $this->client->getContainer()->get('session'); 

     // the firewall context defaults to the firewall name 
     $firewallContext = 'main'; 

     $token = new UsernamePasswordToken('admin', null, $firewallContext, array('ROLE_ADMIN')); 
     $session->set('_security_'.$firewallContext, serialize($token)); 
     $session->save(); 

     $cookie = new Cookie($session->getName(), $session->getId()); 
     $this->client->getCookieJar()->set($cookie); 
    } 

    public function testLoginToBackOffice() 
    { 
     $this->logIn(); 
     $crawler = $this->client->request('GET', '/admin'); 
     $response = $this->client->getResponse(); 
     $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); 
     //200 means i am logged in else should be a redirection to the login path 
    } 


} 

J'utilise pour mes tests sqlite3 comme couche de base de données, voici ce que je mets dans mon config_test.yml

doctrine: 
    dbal: 
    driver: pdo_sqlite 
    path:  "%kernel.cache_dir%/db" 
    charset: UTF8 

Et avant d'exécuter des tests functionnals, je construis un db avec le schéma et quelques accessoires .

php bin/console doctrine:database:drop --force --env=test 
php bin/console doctrine:database:create --env=test 
php bin/console doctrine:schema:create --env=test 
php bin/console doctrine:fixtures:load --env=test -n 

À l'intérieur de l'appareil, je crée un utilisateur admin. Je viens de le faire maintenant le test est passé.

+0

Je l'ai fait, mais ça ne marche pas pour moi. C'est pourquoi je demande – Night

+0

Je viens d'éditer ma réponse, j'espère que cela va vous aider – jeremy

+0

Cela fonctionne maintenant, merci !. J'ai tellement de confusion dans la tête en ce moment. Je suis sûr que j'ai essayé exactement le même code et cela n'a pas fonctionné ainsi j'ai commencé à expérimenter avec FOS; – Night