Я не совсем уверен, что понимаю ваш вопрос, но вы просто спрашиваете, как вы входите программно?
В моих тестах я просто делаю вызов типа:
$this->container->get('security.context')->setToken(
new UsernamePasswordToken(
'maintenance', null, 'main', array('ROLE_FIXTURE_LOADER')
)
);
Inэтот экземпляр 'обслуживания' даже не является реальной сущностью пользователя, это просто имя пользователя, которое я создал для своих приборов, чтобы они могли получить доступ к услуге, имея ROLE_FIXTURE_LOADER
, но если вы действительно хотите войти в систему как полноправная сущность пользователя (такчто они имеют правильный ACL ID) вы можете получить объект $user
из базы данных и вызвать:
$this->container->get('security.context')->setToken(
new UsernamePasswordToken(
$user, null, 'main', $user->getRoles())
)
);
Это не делает полный вход в систему, но он работает с RBAC, и я непонять, почему он не будет работать с ACL, если вы передадите фактический пользовательский объект.
Что касается функционального тестирования моего интерфейса, если мне нужно войти, я просто перехожу на страницу входа и отправляю форму согласнотестирование документов.Для того чтобы любой из них работал, вам необходим доступ к контейнеру, поэтому вам нужно расширить WebTestCase
или развернуть свою собственную возможность загрузки ядра (см. здесь ).
У меня такое чувство, что я неправильно понял вопрос (т.е. вам нужно сделать что-то более сложное, чем просто поместить токен).Возможно, вы могли бы попытаться уточнить, что вы подразумеваете под
передачей или подделкой логина
Конкретный пример установки токена безопасности в тесте:
Сначала мы создадим базовый класс для наших тестов, который будет содержать удобный метод входа в систему.Это можно сделать, расширив WebTestCase
и используя метод getContainer
для client
ИЛИ вы можете разделить WebTestCase
, чтобы свернуть ваш собственный базовый класс, который просто загружает ядро без клиента и возвращает контейнер (см. Мой ссылка для двух решений для достижения этой цели).
namespace Acme\SomeBundle\Tests;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
abstract class AcmeTestCase extends WebTestCase {
protected function loginAs($client, $username) {
$container = $client->getContainer();
$doctrine = $container->get('doctrine');
$user = $this->loadUser($doctrine, $username);
// First Parameter is the actual user object.
// Change 'main' to whatever your firewall is called in security.yml
$container->get('security.context')->setToken(
new UsernamePasswordToken(
$user, null, 'main', $user->getRoles()
)
);
}
private function loadUser($doctrine, $username) {
// Don't have to use doctrine if you don't want to, you could use
// a service to load your user since you have access to the
// container.
// Assumes User entity implements UserInterface
return $doctrine
->getRepository('AcmeUserBundle:User')
->findOneByUsername($username);
}
}
Тогда вам просто нужно использовать базовый класс в любом тесте, который вы пожелаете.Вот так:
namespace Acme\SomeBundle\Tests\Entity;
use Acme\SomeBundle\Tests\AcmeTestCase;
class SomeEntityTest extends AcmeTestCase {
public function somethingTest() {
$this->loginAs(static::createClient(), 'SomeUsernameInDB');
// Do the rest of your test here.
}
}
Надеюсь, это поможет.