Я пишу функциональные тесты в Symfony и пытаюсь сохранить сеанс между тестами, чтобы мне не приходилось повторять процесс аутентификации в каждом тесте. Однако я столкнулся с проблемой:
Каждый раз, когда вызывает новый тест, идентификатор сеанса меняется, и, соответственно, аутентификация снова требуется. < /P>
Что я пробовал: < /< / p>
Using MockFileSessionStorage, but it only works within a single test and does not persist between tests.
Disabling client reboot with $this->client->disableReboot();, but the session is still not carried over to the next test.
Manually setting and retrieving session data in logIn(), including setting cookies:
< /code>
protected function setUp(): void
{
parent::setUp();
$this->client = static::createClient([ 'environment' => 'test'], array(
'PHP_AUTH_USER' => 'Tanya',
'PHP_AUTH_PW' => 'N7jKuXn97ReDK',
));
$this->client->disableReboot();
$this->client->setServerParameter('HTTP_HOST', '172.19.0.1');
$this->entityManager = self::$kernel->getContainer()->get('doctrine')->getManager();
$this->entityManager->beginTransaction();
$this->entityManager->getConnection()->setAutoCommit(false);
foreach (self::getFixtures() as $fixture) {
$fixture->load($this->entityManager);
}
$this->logIn();
}
< /code>
protected function logIn(): void
{
$session = self::$container->get('session');
$userProvider = self::$container->get('security.user.provider.concrete.fos_userbundle');
$user = $userProvider->loadUserByUsername('Tanya');
$roles = (array) $user->getRoles();
$token = new UsernamePasswordToken($user, null, 'admin', $roles);
$session->set('_security_admin', serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
< /code>
But even with these attempts, each test seems to start with a fresh session.
Question:
Is there a way to persist the session between tests in Symfony so that I don't have to log in repeatedly? Or is logging in at the beginning of each test the only reliable option?
I am using Symfony 4.4 with functional tests in a test environment.
Any suggestions or best practices would be appreciated!
My Tests
public function testAdminLoginForm()
{
$session = self::$container->get('session');
$sessionIdBefore = $session->getId();
var_dump("Session ID before login:", $sessionIdBefore);
$crawler = $this->client->request('GET', '/admin/login');
$csrfToken = $crawler->filter('input[name="_csrf_token"]')->attr('value');
$form = $crawler->selectButton('Log in')->form([
'_csrf_token' => $csrfToken,
'_username' => 'Tanya',
'_password' => 'N7jKuXn97ReDK',
]);
$this->client->submit($form);
var_dump("Session ID before redirect:", $session->getId());
$cookieJar = $this->client->getCookieJar();
var_dump($cookieJar->all());
$this->client->followRedirect();
$this->client->request('GET', '/admin');
var_dump($cookieJar->all());
$session = $this->client->getRequest()->getSession();
$sessionIdAfterRedirect = $session ? $session->getId() : null;
var_dump("Session ID after redirect:", $sessionIdAfterRedirect);
$tokenStorage = self::$container->get('security.token_storage');
$token = $tokenStorage->getToken();
$this->assertNotNull($token, "User should be authenticated");
$user = $token->getUser();
$this->assertSame('Tanya', $user->getUsername());
}
< /code>
The next test should pick up the session and not require re-authentication
/**
* @test
*/
public function testCaridBrandListPage()
{
$crawler = $this->client->request('GET', '/admin/login');
$csrfToken = $crawler->filter('input[name="_csrf_token"]')->attr('value');
$form = $crawler->selectButton('Log in')->form([
'_csrf_token' => $csrfToken,
'_username' => 'Tanya',
'_password' => 'N7jKuXn97ReDK',
]);
$this->client->submit($form);
$this->client->followRedirect();
$crawler = $this->client->request('GET', '/admin/carid/amazon/marketplace-entities-caridbrand/list');
$tokenStorage = self::$container->get('security.token_storage');
$token = $tokenStorage->getToken();
if ($token) {
$user = $token->getUser();
var_dump("Authenticated user:", $user);
} else {
var_dump("No authenticated user!");
}
$this->assertNotNull($token, "User should be authenticated after login");
$response = $this->client->getResponse();
$this->assertEquals(200, $response->getStatusCode());
$this->assertSelectorTextContains('li.active', 'Carid Brand List');
if ($crawler->filter('.info-box-text')->count() > 0) {
$this->assertEmpty($crawler->filter('.list-unstyled > li'), "List should be empty when 'No result' is shown.");
} else {
$this->assertNotEmpty($crawler->filter('.list-unstyled > li'), "List should not be empty when 'No result' is not shown.");
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-symfony
Как сохранить сессию между тестами на аутентификацию в Symfony? ⇐ Php
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как выполнить HTTP -запрос, который прикреплен PHP сессию к маршруту Symfony? [закрыто]
Anonymous » » в форуме Php - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Невозможно сохранить сессию PHP для последующих вызовов API после входа в систему
Anonymous » » в форуме Php - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Включить как аутентификацию Windows, так и анонимную аутентификацию в приложении ASP.NET Core
Anonymous » » в форуме C# - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-