Laravel Assert Redirect игнорирует параметры запроса

У меня есть тест API, который утверждает перенаправление на определенный маршрут. Проблема заключается в том, что URL-адрес перенаправления имеет параметры запроса, которые включают отметку времени, которая изменяется. Интересно, есть ли у утверждений Laravel альтернатива методу assertRedirect, который игнорирует параметры запроса.

/** @test */
    public function test_can_redirect()
    {

        $this->call('GET', "users/auth")
            ->assertRedirect('http://localhost:8000/dashboard?timestamp=1550848436');
    }

Я хочу установить перенаправление на

http://localhost:8000/dashboard

нет

http://localhost:8000/dashboard?timestamp=1550848436

В чем именно ваша проблема? Это значение является динамическим? Просто удалите его из строки перед передачей в assertRedirect.

Marco 22.02.2019 18:41
->assertRedirect('http://localhost:8000/dashboard'); ?
Nikolai Kiselev 22.02.2019 19:43

Отметка времени включается в сравнение uri при использовании assertRedirect

Winnipass 23.02.2019 19:25

У меня прямо противоположная проблема, я хочу утверждать, что местоположение перенаправления имеет заданный параметр строки запроса, но, похоже, он отсутствует, $response->headers->get('Location') вообще не имеет параметров строки запроса.

reppair 10.12.2021 17:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
885
2

Ответы 2

Принцип тестирования вашего кода заключается в том, чтобы убедиться, что происходит то, что ожидается, поэтому, если вы ожидаете параметр запроса временной метки, почему бы не создать его тоже?

/** @test */
    public function test_can_redirect()
    {
        $url = "/dashboard";
        // http://php.net/manual/en/function.time.php
        $timestamp = time();

        $this->call('GET', "users/auth")
            ->assertRedirect($url . '?timestamp=' . $time);
    }

Временная метка, сгенерированная в вашем тесте, и сгенерированная форма контроллера все равно будут отличаться. Время не является постоянным

Winnipass 23.02.2019 19:21

Вы можете использовать getTargetUrl для извлечения того, что не содержит строки запроса.

public function test_can_redirect()
{
    $redirectUrl = 'http://localhost:8000/dashboard';
    $res = $this->getJson('users/auth')->assertStatus(302); # Check if redirection
    # Or you could use this: $this->assertTrue($res->isRedirection());
    $parts = explode('?', $res->getTargetUrl());
    $this->assertTrue($parts[0] === $redirectUrl); # parts[0] is the url 
wihtout query string

    # If you want to check the keys of query string, too
    $this->assertTrue(count($parts) === 2);  # check query string exists
    parse_str($parts[1], $query);
    $this->assertArrayKeys($query, ['time', ..., 'the key you want to check']);
}

protected function assertArrayKeys(array $array, array $checks) 
{
    $keys = array_keys($array);
    foreach ($checks as $check) {
        $this->assertTrue(in_array($check, $keys));
    }
}

Другие вопросы по теме