Symfony2 - Tests mit FOSUserBundle
ich würde einen test schreiben für Symfony2 mit FOSUserBundle.
In dem moment habe ich versucht, einige Möglichkeiten und niemand arbeitet.
Brauche ich eine Funktion wie "createAuthClient".
Hier ist mein basic-Klasse.
Ich poste es, weil Sie verstehen konnte mein problem besser.
<?php
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\BrowserKit\Cookie;
class WebTestMain extends WebTestCase
{
protected static $container;
static protected function createClient(array $options = array(), array $server = array())
{
$client = parent::createClient($options, $server);
self::$container = self::$kernel->getContainer();
return $client;
}
static function createAuthClient(array $options = array(), array $server = array())
{
//see lines below with my tries
}
}
Erster Versuch:
if(static::$kernel === null)
{
static::$kernel = static::createKernel($options);
static::$kernel->boot();
}
if(static::$container === null)
{
self::$container = self::$kernel->getContainer();
}
$parameters = self::$container->getParameter('test');
$server = array_merge(array('HTTP_HOST' => $parameters['host'], 'HTTP_USER_AGENT' => $parameters['useragent']), $server);
$client = self::createClient($options, $server);
$userProvider = self::$container->get('fos_user.user_manager');
$user = $userProvider->findUserBy(array('id' => 1));
$client->getCookieJar()->set(new Cookie('MOCKSESSID', true));
$session = self::$kernel->getContainer()->get('session');
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$client->getContainer()->get('security.context')->setToken($token);
$session->set('_security_main', serialize($token));
return $client;
Dann habe ich gesucht und gesucht...
Meinen zweiten Versuch.
if(static::$kernel === null)
{
static::$kernel = static::createKernel($options);
static::$kernel->boot();
}
if(static::$container === null)
{
self::$container = self::$kernel->getContainer();
}
$parameters = self::$container->getParameter('test');
$server = array_merge(
array(
'HTTP_HOST' => $parameters['host'],
'HTTP_USER_AGENT' => $parameters['useragent'],
'PHP_AUTH_USER' => 'admin',
'PHP_AUTH_PW' => 'admin'
),
$server
);
$client = static::createClient(array(), array());
$client->followRedirects();
return $client;
Und hier ist mein letzter Versuch, bevor ich poste diese Frage...
$client = self::createClient($options, $server);
$parameters = self::$container->getParameter('test');
$server = array_merge(
array(
'HTTP_HOST' => $parameters['host'],
'HTTP_USER_AGENT' => $parameters['useragent']
),
$server
);
$client->setServerParameters($server);
$usermanager = self::$container->get('fos_user.user_manager');
$testuser = $usermanager->createUser();
$testuser->setUsername('test');
$testuser->setEmail('[email protected]');
$testuser->setPlainPassword('test');
$usermanager->updateUser($testuser);
return $client;
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, die ich gefunden habe, um zu testen, mit einem authentifizierten Benutzer ist, besuchen Sie einfach Ihre login-Seite und senden Sie das Formular mit Benutzername und Passwort, die Sie geladen haben, aus einer Halterung. Das mag langsam und umständlich, aber wird testen, was die Nutzer tatsächlich tun wird. Sie können sogar erstellen Sie Ihre eigenen Methode, die es schnell und einfach.
Erstellen Sie eine
AbstractControllerTest
und erstellen Sie ein autorisierter client aufsetUp()
wie folgt:HINWEIS: Bitte ersetzen Sie den Benutzernamen mit Ihrem test-Benutzernamen.
Dann, verlängert sich die
AbstractControllerTest
und verwenden Sie die Globale$client
Anfragen zu stellen wie folgt:Diese Methode getestet und funktioniert einwandfrei
Client
Klassen aus verschiedenen Drittanbieter-bundles. Ich hatte zu schauen und zu testen, bis zu realisieren, dassSymfony\Component\BrowserKit\Client
war die richtige. Ihre Antwort, während gleichzeitig ein schönes Beispiel wäre viel nützlicher, wenn es im Lieferumfang enthalten-Anweisungen verwenden. Wie jetzt, die manuelle Arbeit, herauszufinden, die Lösung ist immer noch erforderlich.