PHPUnit и объект запроса Kohana
Я пытаюсь ознакомиться с тестированием PHPUnit в Kohana. В настоящий момент у меня возникают проблемы с перенаправлением вызовов Request::current()-> в моем коде.
Например, я пытаюсь проверить функциональность входа в систему. Как только наш пользователь успешно вошел в систему, мы перенаправляем его на его домашнюю страницу, используя указанную выше строку перенаправления запроса. Проблема в том, что когда эта строка есть, тест останавливается и никогда не возвращает результаты.
Вот как мои тесты написаны на данный момент:
class SampleTest extends Kohana_UnitTest_TestCase
{
protected $session;
public function setUp() {
parent::setUp();
$this->session = Session::instance();
}
public function testLogin()
{
$request = new Request('/login');
$request->method(HTTP_Request::POST)
->post(array('username' => 'username', 'password' => 'password'));
$request->execute();
$this->assertEquals($this->session->get('username'), 'password');
}
}
Если я закомментирую следующую строку в моем контроллере входа, все будет отлично работать:
Request::current()->redirect(); //redirect to home
Что я делаю неправильно?
2 ответа
Порядок операций для стандартного запроса (проверьте ваш index.php):
- выполнять
- send_headers
- тело
Вы перехватили запрос в середине выполнения и перенаправили процесс. Ваш тест просто следует этому коду, поскольку он является частью этого выполнения.
Вместо этого отложите перенаправление, добавив его в заголовки запроса, которые выполняются в send_headers, и вы не попадете в этот код при тестировании модуля. Замените строку Request::current()->redirect() правильным способом перенаправления пользователей:
$this->response->headers("Location", URL::site(NULL, TRUE));
Я думаю, что лучший способ проверить перенаправления в Kohana - это расширить класс Request с помощью Unittest_Request.
Добавьте метод перенаправления в класс Unittest_Request, который использует заголовок Location.
Добавьте несколько вспомогательных методов в свои тесты для создания запросов на получение и публикацию с использованием запросов Unittest.
Напишите методы assert, такие как assertRedirectedTo, assertResponse.... и так далее.
Я знаю, что это много, но это действительно поможет вам в долгосрочной перспективе.