PHPUnit и объект запроса Kohana

Я пытаюсь ознакомиться с тестированием PHPUnit в Kohana. На данный момент у меня, похоже, проблемы с вызовами Request::current()->redirect в моем коде.

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

Вот как написаны мои тесты на данный момент:

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

Что я делаю неправильно?


person Emilie    schedule 28.03.2012    source источник


Ответы (2)


Порядок операций для стандартного запроса (проверьте ваш index.php):

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

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

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

$this->response->headers("Location", URL::site(NULL, TRUE));
person gspatel    schedule 29.03.2012
comment
Спасибо! Это действительно было проблемой. Теперь работает как шарм! :) - person Emilie; 31.03.2012
comment
На самом деле, для того, чтобы перенаправление происходило корректно в самом моем приложении, мне пришлось использовать следующую строку перенаправления: $this-›response-›headers(Location, URL::site(NULL, TRUE)); - person Emilie; 31.03.2012
comment
Исправлен мой ответ, чтобы включить ваше предложение. - person gspatel; 05.04.2012

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

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

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

Напишите методы утверждения, такие как assertRedirectedTo, assertResponse.... и так далее.

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

person Haralan Dobrev    schedule 03.04.2012