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):

  1. выполнять
  2. send_headers
  3. тело

Вы перехватили запрос в середине выполнения и перенаправили процесс. Ваш тест просто следует этому коду, поскольку он является частью этого выполнения.

Вместо этого отложите перенаправление, добавив его в заголовки запроса, которые выполняются в send_headers, и вы не попадете в этот код при тестировании модуля. Замените строку Request::current()->redirect() правильным способом перенаправления пользователей:

$this->response->headers("Location", URL::site(NULL, TRUE));

Я думаю, что лучший способ проверить перенаправления в Kohana - это расширить класс Request с помощью Unittest_Request.

Добавьте метод перенаправления в класс Unittest_Request, который использует заголовок Location.

Добавьте несколько вспомогательных методов в свои тесты для создания запросов на получение и публикацию с использованием запросов Unittest.

Напишите методы assert, такие как assertRedirectedTo, assertResponse.... и так далее.

Я знаю, что это много, но это действительно поможет вам в долгосрочной перспективе.

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