Почему я не могу проверять заголовки в тестах Yii2?

Привет! Я тестирую функциональность простой страницы, которая должна быть недоступна для гостей, в результате чего происходит редирект на страницу логина. Вот код, который я использую: 

<pre><code class="php">public function guestListUsersTest(FunctionalTester $I)
    {
        $I-&gt;amOnRoute('user/crud/index');
       
        // эти методы не срабатывают
        $I-&gt;seeResponseCodeIs(302);
        // также не работает
        //$I-&gt;seeResponseCodeIsRedirection();
    }</code></pre>

Как видно, метод amOnPage выполняет редирект и возвращает страницу логина, что подтверждает этот код: 
<pre><code class="php">$I-&gt;amOnRoute('user/crud/index');
        // этот метод работает
        $I-&gt;seeCurrentUrlEquals('/site/login');</code></pre>

В связи с этим, как мне тогда проверить код ответа с помощью методов, таких как seeResponseCodeIs? Вот конфигурация для функционального тестирования, которую я использую, она по умолчанию: 

<pre><code>actor: FunctionalTester
modules:
    enabled:
      - Filesystem
      - Yii2
      - Asserts</code></pre>
  • 26 ноября 2024 г. 4:33
Ответы на вопрос 1
В 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()`.
Похожие вопросы