2016-07-30 12 views
0

simulieren Ich versuche, eine Seite durch Authentifizierungsformular Funktion getestet zu testen.Wie authentifizierte Benutzer in Funktionstests in Silex PHP-Framework

Mein Code wird auf diesen Link basiert: http://symfony.com/doc/current/testing/simulating_authentication.html

Aber es ist für mich immer noch nicht. Hier

ist Thye Fehlermeldung, die ich bekomme:

PHP Fatal error: Call to undefined method Symfony\Component\HttpKernel\Client::getContainer() 

Hier ist mein Code:

class ClientTest extends WebTestCase { 

    public function createApplication() 
    { 
     return require __DIR__.'/../app.php'; 
    } 

    /** 
    * @test 
    */ 
    public function index_when_no_clients() 
    { 
     $this->client = $this->createClient(); 
     $crawler = $this->client->request('GET', '/'); 

     $this->assertTrue($this->client->getResponse()->isOk()); 
     $this->assertCount(1, $crawler->filter('h1:contains("Clients")')); 
     $this->assertCount(1, $crawler->filter('span[class="glyphicon glyphicon-plus"]')); 
    } 

    /** 
    * @test 
    */ 
    public function add_get_route_is_valid() 
    { 
     $client = $this->createClient(); 
     $session = $client->getContainer()->get('session'); 

     // the firewall context (defaults to the firewall name) 
     $firewall = 'secured_area'; 

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

     $cookie = new Cookie($session->getName(), $session->getId()); 
     $client->getCookieJar()->set($cookie); 
     $crawler = $client->request('GET', '/add'); 

     $this->assertTrue($client->getResponse()->isOk()); 
    } 
} 

Hier ist, wie ich bin Einstellung Authentifizierung in meinem index.php:

$app->register(new \Silex\Provider\SessionServiceProvider(), [ 
    'session.test' => 'test' === $app['env'], 
]); 
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'admin' => array(
      'pattern' => '^/add', 
      'form' => array('login_path' => '/login', 'check_path' => '/add/login_check'), 
      'users' => $app->share(function() use ($app) { 
       $config = Configuration::getInstance(); 
       $pdoQueries = new PdoQueries(PdoConnection::getInstance($config)); 
       return new UserProvider($pdoQueries); 
      }), 
     ), 
    ) 
)); 

$app->get('/login', function(Request $request) use ($app, $arrConfig) { 
    return $app['twig']->render('auth/form.twig', array(
      'error'   => $app['security.last_error']($request), 
      'last_username' => $app['session']->get('_security.last_username'), 
      'title'   => 'Login', 
      'assetsUrl'    => $arrConfig['assets_url'] 
    )); 
}); 

Und hier ist der Inhalt der app.php in createApplication aufgerufen:

<?php 
require __DIR__ ."/../www/index.php"; 
unset($app['exception_handler']); 
return $app; 

Dank

Antwort

3

fand ich das Problem und die Lösung.

Das Problem war die Anweisung getContainer. Die Abhängigkeitsinjektion wird in silex anders aufgerufen. rufen Sie einfach

$app['session'] 

direkt das Problem gelöst.

Hier ist das vollständige Skript mit den Symfony-Klassen zu importieren.

<?php 
use Silex\WebTestCase; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 
use Symfony\Component\BrowserKit\Cookie; 

class ClientTest extends WebTestCase { 

    public function createApplication() 
    { 
     return require __DIR__.'/../app.php'; 
    } 

    private function logIn($client) 
    { 
     $session = $this->app['session']; 
     $firewall = 'admin'; 
     $token = new UsernamePasswordToken('admin', null, $firewall, array('ROLE_ADMIN')); 
     $session->set('_security_'.$firewall, serialize($token)); 
     $session->save(); 
     $cookie = new Cookie($session->getName(), $session->getId()); 
     $client->getCookieJar()->set($cookie); 

     return $client; 
    } 

    /** 
    * @test 
    */ 
    public function index_when_no_clients() 
    { 
     $this->client = $this->createClient(); 
     $crawler = $this->client->request('GET', '/'); 

     $this->assertTrue($this->client->getResponse()->isOk()); 
     $this->assertCount(1, $crawler->filter('h1:contains("Clients")')); 
     $this->assertCount(1, $crawler->filter('span[class="glyphicon glyphicon-plus"]')); 
    } 

    /** 
    * @test 
    */ 
    public function add_get_route_is_valid() 
    { 
     $client = $this->createClient(); 
     $client = $this->logIn($client); 
     $crawler = $client->request('GET', '/add'); 

     $this->assertTrue($client->getResponse()->isOk()); 
    } 

} 

Hoffnung, die anderen Menschen helfen wird.

Verwandte Themen