У меня есть тест 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('http://localhost:8000/dashboard'); ?
Метод assertRedirect сравнит локальный хост: 8000/приборная панель с локальный хост: 8000/приборная панель? Отметка времени = 1550848436 и вернет false.
Отметка времени включается в сравнение uri при использовании assertRedirect
У меня прямо противоположная проблема, я хочу утверждать, что местоположение перенаправления имеет заданный параметр строки запроса, но, похоже, он отсутствует, $response->headers->get('Location') вообще не имеет параметров строки запроса.






Принцип тестирования вашего кода заключается в том, чтобы убедиться, что происходит то, что ожидается, поэтому, если вы ожидаете параметр запроса временной метки, почему бы не создать его тоже?
/** @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);
}
Временная метка, сгенерированная в вашем тесте, и сгенерированная форма контроллера все равно будут отличаться. Время не является постоянным
Вы можете использовать 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));
}
}
В чем именно ваша проблема? Это значение является динамическим? Просто удалите его из строки перед передачей в assertRedirect.