Тесты Symfony не вызывают мой LoginSubscriber, используя обходной путь ручного входа в систему и не возвращая ожидаемый Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Тесты Symfony не вызывают мой LoginSubscriber, используя обходной путь ручного входа в систему и не возвращая ожидаемый

Сообщение Anonymous »

Я использую Symfony 6.4, и у меня есть LoginSubcriber, который устанавливает некоторые дополнительные данные сеанса в зависимости от настройки учетной записи аутентифицированного пользователя. Эти дополнительные данные сеанса необходимы для работы сайта.
Мой подписчик зарегистрирован в /config/services.yaml как таковой:

Код: Выделить всё

services:
...
App\EventListener\LoginSubscriber:
tags: [ name: kernel.event_subscriber ]
И он отлично работает при входе в систему через браузер.
Моя проблема возникает при тестировании. Если я вызываю вход в систему $client->loginUser($user), то мой LoginSubscriber никогда не вызывается, из-за чего последующие запросы не работают должным образом, поскольку у них нет правильной настройки данных сеанса в LoginSubscriber.
Чтобы обойти эту проблему, я изменил свой тест на вход пользователя в систему вручную, пройдя весь процесс:

Код: Выделить всё

class FullSearchTest extends WebTestCase
{
public function testPartialSearchRequiresThreeCharacters(): void
{
$client = static::createClient();

$crawler = $client->request('GET', '/');
$form = $crawler->selectButton('SIGN IN')->form([
'_username' => 'admin',
'_password' => 'password',
]);
$client->submit($form);
$client->followRedirects();

$client->request('GET', '/search', [
'firstName' => 'fo',
]);

$this->assertResponseIsUnprocessable();
}
}
Я запускаю тест с помощью phpunit, например php bin/phpunit
Для маршрута/поиска требуется ROLE_USER, поэтому они должны быть зарегистрированы in. Однако мой тест не удался, потому что ответ 200 OK, а внутри вывода отображается HTML-код страницы входа в систему, а не содержимое /search.
Если я изменю $this->assertResponseIsUnprocessable(); to $this->assertResponseRedirects('/'); то это также завершается неудачей, поскольку на самом деле не происходит перенаправление на страницу входа. Если я изменю свой тест, удалив шаг входа в систему, перейду прямо к /search и вызову $this->assertResponseRedirects('/');, тогда тест пройдет. Поэтому я не уверен, что проблема в том, что пользователь не вошел в систему, а скорее в том, что данные ответа/запроса застревают при входе в систему, а не меняются на последующий запрос/поиск, несмотря на $client->followRedirects() ; установлен.
Думаю, у меня вопрос: есть ли способ заставить $client->loginUser($user); запускать LoginSubscriber, а если нет, Есть ли способ обойти мой ручной вход в систему, чтобы вернуть статус ответа/данные последующих запросов, например /search в данном случае.

Подробнее здесь: https://stackoverflow.com/questions/792 ... around-not
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»