Привет! Я тестирую функциональность простой страницы, которая должна быть недоступна для гостей, в результате чего происходит редирект на страницу логина. Вот код, который я использую:
<pre><code class="php">public function guestListUsersTest(FunctionalTester $I)
{
$I->amOnRoute('user/crud/index');
// эти методы не срабатывают
$I->seeResponseCodeIs(302);
// также не работает
//$I->seeResponseCodeIsRedirection();
}</code></pre>
Как видно, метод amOnPage выполняет редирект и возвращает страницу логина, что подтверждает этот код:
<pre><code class="php">$I->amOnRoute('user/crud/index');
// этот метод работает
$I->seeCurrentUrlEquals('/site/login');</code></pre>
В связи с этим, как мне тогда проверить код ответа с помощью методов, таких как seeResponseCodeIs? Вот конфигурация для функционального тестирования, которую я использую, она по умолчанию:
<pre><code>actor: FunctionalTester
modules:
enabled:
- Filesystem
- Yii2
- Asserts</code></pre>
В Yii2 функциональные тесты работают немного иначе, чем юнит-тесты. Когда вы выполняете запрос с помощью `$I->amOnRoute()`, это вызывает перенаправление, и в результате это не оставляет информацию о коде ответа, который вы хотите проверить.
Когда вы вызываете `$I->amOnRoute('user/crud/index');`, ваше приложение обрабатывает запрос, а затем выполняет редирект, поэтому дальнейшие проверки кода ответа, такие как `seeResponseCodeIs(302)`, не срабатывают, потому что вы уже перешли на новую страницу.
Для проверки кода ответа на редирект в функциональных тестах вы можете использовать запрос через `sendGET()` или `sendPOST()` вместо `amOnRoute()`, чтобы получить прямой ответ от сервера без перенаправления. Например:
```php
public function guestListUsersTest(FunctionalTester $I)
{
$I->sendGET('user/crud/index');
// Проверяем, что редирект происходит (302)
$I->seeResponseCodeIs(302);
// Проверяем, что мы редиректим на страницу логина
$I->seeHeadersContains(['Location' => '/site/login']);
}
```
В данном коде:
1. Используется `sendGET()` для отправки запроса к нужному маршруту.
2. Затем `seeResponseCodeIs(302)` проверяет, что ответом действительно является код 302.
3. `seeHeadersContains()` используется, чтобы проверить, что в заголовках ответа есть заголовок `Location`, указывающий на страницу логина.
Таким образом, вы сможете проверить код ответа и заголовки, избегая проблем с редиректами, которые могут возникать при использовании методов `amOnRoute()`.
У вас сначала происходит редирект а потом <code>$I->seeResponseCodeIs(302);</code> проверяет заголовки, надо явно запретить переходить по редиректу: <br/> <br/> <pre><code class="php">public function guestListUsersTest(FunctionalTester $I)
{
// Запрещаем редирект
$I->getModule('Yii2')->_reconfigure(['followRedirect' => false]);
$I->amOnRoute('user/crud/index');
// Проверяем код ответа
$I->seeResponseCodeIs(302);
// Также можно проверить наличие заголовка Location
$I->seeHttpHeader('Location', '/site/login');
}</code></pre>